zoukankan      html  css  js  c++  java
  • Android中数据的保存

    1. 概述

    在Android中有以下几种保存数据方式:

    1). 使用sharedPreference去保存:只有应用程序自己可以访问

    2). 保存在应用程序私有的文件夹下:只有应用程序自己可以访问

    3). 使用File形式保存在file/cache目录下

    4). 保存到公共的sd卡上:其他的应用程序也可以访问

    5). 使用数据库去保存(MySQL)

     

    其中1.2.3的共性都是保存在当前应用的目录下的私有数据

     

    2. 方法一:File方式保存

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            try{
                File f = new File("/data/data/com.example.aplex.testforgit/test.txt");
                BufferedWriter writer = new BufferedWriter(new FileWriter(f)) ;
                writer.write("hahahehe");
                writer.close();
            }catch (IOException e){
                e.printStackTrace();
            }
    
        }

    3. 方法二:File方式保存(data/cache目录下)

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            try{
                //1. 保存在应用的cache中
                {
                    File f = new File(getCacheDir(),"cache.txt");
                    BufferedWriter writer = new BufferedWriter(new FileWriter(f)) ;
                    writer.write("hahahehe");
                    writer.close();
                }
    
            }catch (IOException e){
                e.printStackTrace();
            }
            //2. 保存在应用的file中
                try {
                    File f = new File(getFilesDir(),"file.txt");
                    BufferedWriter writer = new BufferedWriter(new FileWriter(f)) ;
                    writer.write("hahahehe");
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

     

    注意:清除数据会把data目录下改应用的所有数据都清除掉,而清除缓存则只会清除cache目录下的数据

     

     

    4. 方法三:使用sharedPreference去保存

     Xml 文件可以用来保存数据

    注意: 使用sharedPreferences保存数据时,  生成的xml 文件是

    在  /data/data/包名/shared_prefs 目录下.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.aplex_new1.myapplication.MainActivity">
    
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入账号"
            android:inputType="number"
            android:id="@+id/ed"/>
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="清输入密码:"
            android:inputType="numberPassword"
            android:id="@+id/ed2"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="确认"
            android:id="@+id/bt" />
    
    </LinearLayout>
    package com.example.aplex_new1.myapplication;
    
    import android.content.SharedPreferences;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class MainActivity extends AppCompatActivity {
        Button bt1;
        EditText accountView;
        EditText pwdView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bt1 = findViewById(R.id.bt);
            accountView = findViewById(R.id.ed);
            pwdView = findViewById(R.id.ed2);
            //获取到mydata.xml对象,没有则会创建一个
            SharedPreferences sp = getSharedPreferences("mydata", 0);
            //拿到编辑器
            SharedPreferences.Editor ed = sp.edit();
            //获取出mydata.xml中键值为account的数据
            String account = sp.getString("account", "");
            //获取出mydata.xml中键值为pwd的数据
            String pwd = sp.getString("pwd","");
            
            //显示出来
            accountView.setText(account);
            pwdView.setText(pwd);
    
            bt1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SharedPreferences sp = getSharedPreferences("mydata", 0);
                    SharedPreferences.Editor ed = sp.edit();
                    
                    String account = accountView.getText().toString();
                    String pwd = pwdView.getText().toString();
                    //放入数据中
                    ed.putString("account", account);
                    ed.putString("pwd", pwd);
                    //提交
                    ed.apply();
                }
            });
        }
    }

    现象:第一次点击应用

    账号密码都为空

    在输入完账号密码后,退出,再次点击,则会回显出来

     

    因为数据已经保存进了XML文件中去了

     

    打开mydata.xml

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <map>
        <string name="account">1234567</string>
        <string name="pwd">1234567</string>
    </map>

    4. 方法四:保存到公共的sd卡上:

    1. 概念和代码

     AndroidManifest.xml

    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

    SDFileHelper.java

    public class SDFileHelper {
        String TAG = "SDFileHelper";
    
        private Context context;
    
        public SDFileHelper() {
        }
    
        public SDFileHelper(Context context) {
            super();
            this.context = context;
        }
    
        //往SD卡写入文件的方法
        public void savaFileToSD(String filename, String filecontent) throws Exception {
            //如果手机已插入sd卡,且app具有读写sd卡的权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
                Log.d(TAG,"文件名:"+filename);
                //这里就不要用openFileOutput了,那个是往手机内存中写数据的
                FileOutputStream output = new FileOutputStream(filename);
    
                output.write(filecontent.getBytes());
                //将String字符串以字节流的形式写入到输出流中
                output.close();
                //关闭输出流
            } else Toast.makeText(context, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
        }
    
        //读取SD卡中文件的方法
        //定义读取文件的方法:
        public String readFromSD(String filename) throws IOException {
            StringBuilder sb = new StringBuilder("");
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
                //打开文件输入流
                FileInputStream input = new FileInputStream(filename);
                byte[] temp = new byte[1024];
    
                int len = 0;
                //读取文件内容:
                while ((len = input.read(temp)) > 0) {
                    sb.append(new String(temp, 0, len));
                }
                //关闭输入流
                input.close();
            }
            return sb.toString();
        }
    }

    MainActivity.java

    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
        private EditText editname;
        private EditText editdetail;
        private Button btnsave;
        private Button btnclean;
        private Button btnread;
        private Context mContext;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = getApplicationContext();
            bindViews();
        }
    
        private void bindViews() {
            editname = (EditText) findViewById(R.id.edittitle);
            editdetail = (EditText) findViewById(R.id.editdetail);
            btnsave = (Button) findViewById(R.id.btnsave);
            btnclean = (Button) findViewById(R.id.btnclean);
            btnread = (Button) findViewById(R.id.btnread);
    
            btnsave.setOnClickListener(this);
            btnclean.setOnClickListener(this);
            btnread.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btnclean:
                    editdetail.setText("");
                    editname.setText("");
                    break;
                case R.id.btnsave:
                    String filename = editname.getText().toString();
                    String filedetail = editdetail.getText().toString();
                    SDFileHelper sdHelper = new SDFileHelper(mContext);
                    try
                    {
                        sdHelper.savaFileToSD(filename, filedetail);
                        Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
                    }
                    catch(Exception e){
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
                    }
                    break;
                case R.id.btnread:
                    String detail = "";
                    SDFileHelper sdHelper2 = new SDFileHelper(mContext);
                    try
                    {
                        String filename2 = editname.getText().toString();
                        detail = sdHelper2.readFromSD(filename2);
                    }
                    catch(IOException e){e.printStackTrace();}
                    Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

    2. 6.0上SD卡的权限和动态申请权限的问题(重点!!)

    Android6.0之后系统对权限的管理更加严格了,不但要在AndroidManifest中添加,还要在应用运行的时候动态申请。下面是动态申请SD卡读写的权限

    1. 在AndroidManifest中添加SD卡读写的权限

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    2. 申请权限

    申请权限有两种方式:

    1). 手动打开权限:

    Settings-->Apps-->找到所需要的应用-->Permissions-->打开权限

    2). 在程序中动态申请权限(重点):

     private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static String[] PERMISSIONS_STORAGE = {
                "android.permission.READ_EXTERNAL_STORAGE",
                "android.permission.WRITE_EXTERNAL_STORAGE" };
    
    
        public static void verifyStoragePermissions(Activity activity) {
    
            try {
            //检测是否有写的权限
                int permission = ActivityCompat.checkSelfPermission(activity,
                        "android.permission.WRITE_EXTERNAL_STORAGE");
                if (permission != PackageManager.PERMISSION_GRANTED) {
            // 没有写的权限,去申请写的权限,会弹出对话框
                    ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    5. 方法五:使用数据库(MySQL)去保存

    MySQL数据库

    SQLite数据库

     

  • 相关阅读:
    C# 文件类的操作---删除
    C#实现Zip压缩解压实例
    UVALIVE 2431 Binary Stirling Numbers
    UVA 10570 meeting with aliens
    UVA 306 Cipher
    UVA 10994 Simple Addition
    UVA 696 How Many Knights
    UVA 10205 Stack 'em Up
    UVA 11125 Arrange Some Marbles
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/maogefff/p/7784992.html
Copyright © 2011-2022 走看看