数据存储

文件存储

Android 中一种基本的数据存储方式,它不对存储内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的,因而他比较适合用于存储一些简单的文本数据或二进制数据。

常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

将数据存储到文件中

利用 Content 类的 openFileOutput() 方法,有两个参数,第一个是文件名,第二个是文件的操作模式,主要有 MODE_PRIVATE 和 MODE_APPEND 两种。文件默认都是储存到 /data/data/package name/files/ 目录下。

  • MODE_PRIVATE 默认的模式,表示指定同样的文件名的时候,所写入的内容会覆盖文件中的内容。
  • MODE_APPEND 不覆盖,追加

从文件中读取数据

利用 Content 类的 openFileInput() 方法,一个参数,文件名。

例子

利用 try-with-resources 语句来关闭文件。

public class DataSaveActivity extends AppCompatActivity {

    private static final String FILE_NAME = "maData";

    @Bind(R.id.text_input)
    EditText textInput;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data_save);
        ButterKnife.bind(this);

        String inputText = loadData(FILE_NAME);
        if (!TextUtils.isEmpty(inputText)){
            textInput.setText(inputText);
            textInput.setSelection(inputText.length());
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String inputText = textInput.getText().toString();
        saveData(FILE_NAME,inputText);
    }

    /**
     * try-with_resources requires API level 19
     * try-with_resources 语法保证close方法的调用
     * @param fileName
     * @param str
     */
    public void saveData(String fileName, String str){
        FileOutputStream out = null;
        try {
            out = openFileOutput(fileName, Context.MODE_PRIVATE);
            try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out))){
                writer.write(str);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void save(String fileName,String str){
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput(fileName, Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(str);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public String loadData(String fileName){
        FileInputStream in = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput(fileName);
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))){
                String line = "";
                while ((line = reader.readLine()) != null){
                    content.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return content.toString();
    }

    public String load(String fileName){
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput(fileName);
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null){
                content.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }
}

SharedPreference 存储

除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

可以保存的类型有:boolean,float,int,long,String。这些数据将会永久保存

SharedPreferences存储的步骤如下:

  • 根据Context获取SharedPreferences对象
  • 利用edit()方法获取Editor对象。
  • 通过Editor对象存储key-value键值对数据。
  • 通过commit()方法提交数据。

将数据存储到 SharedPreferences 中

获得SharedPreferences对象的三种方式:

  1. Context类中的getSharedPreferences()方法。

    getSharedPreferences()接收两个参数:第一个参数用于指定文件的名称(若不存在则自动创建,无需加后缀,系统自动加),第二个参数指定文件的操作模式,主要有两种模式:MODE_PRIVATE和MODE_MULTI_PROCESS,MODE_PRIVATE和直接传入0效果一样,表示只有当前的应用程序才可以对该SharedPreferences文件进行读写;MODE_MULTI_PROCESS则一般用于多个进程对同一个SharedPreferences文件进行读写的情况。

    通过这种方法获得的SharedPreferences对象能被同一个应用中的所有Activity访问。

  2. Activity类中的getPreferences()方法,该方法只接受一个模式参数,而文件名自动为当前Activity的类名。

    通过这种方法获得的SharedPreferences对象,若其它Activity想获得该SharedPreferences文件,则只能通过Context类中的getSharedPreferences()方法获取SharedPreferences对象,当然文件名必须是该SharedPreferences文件名。

  3. PreferenceManager类中的getDefaultSharedPreferences()方法

    该方法为静态方法,只有一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

向SharedPreferences文件中保存数据

步骤:

  1. 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor(内部类)对象;
  2. 通过putXXX()方法向Editor对象中添加数据;
  3. 调用commit()方法提交数据,完成数据储操作。

    SharedPreferences.Editor editor = getSharedPreferences("fileName", MODE_PRIVATE).edit();
       editor.putString("name","nvgtor");
       editor.putInt("age",1);
       editor.commit();
    

从SharedPreferences文件中读取数据

SharedPreferences sharedPreferences = getSharedPreferences("fileName",MODE_PRIVATE);
  String name = sharedPreferences.getString("name","");
  int age = sharedPreferences.getInt("age",0);

SQLite数据库存储

  • SQLite是开源的,支持标准SQL语法的关系型数据库,支持事务,运行时需要很小的内存(250k);
  • 支持的数据类型包括:Text,INTEGER,REAL(like double in Java),其他的所有数据类型必须转换成以上数据类型才能被存储在数据库中,
  • SQLite是嵌入在每一个Android设备中的,所以使用SQLite并不需要去安装和管理数据库
  • 创建一个数据库后,默认是存在DATA/APP_NAME/databases/FILENAME下的。

SQLiteOpenHelper 类操作数据库

该类用来管理数据库的创建 和版本更新, 通常使用其子类, 实现onCreate() 和 onUpgrade()方法

类中方法:

  1. 读方式打开数据库

    以读写的方式打开数据库 :先以读写方式打开数据库, 如果磁盘满了, 就会打开失败,然后会尝试以只读的方式打开数据库;

    public SQLiteDatabase getReadableDatabase ()  
    
  2. 写方式打开数据库

    先以读写方式打开数据库, 如果磁盘满了, 就会出错,不推荐使用这种方法, 使用 getReadableDatabase()方法即可

    public SQLiteDatabase getWritableDatabase ()  
    
  1. 创建数据库

    第一次创建数据库的时候回调该方法, 一般在该方法中 创建数据库表;调用时机: 当使用getReadableDatabase()方法 获取数据库 实例 的时候, 如果数据库不存在, 就会调用这个方法;方法内容 : 重写该方法一般 将 创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;

    public abstract void onCreate (SQLiteDatabase db)  
    
  2. 更新数据库

    public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)  
    
  3. 关闭数据库

    public synchronized void close ()  
    

更多数据库存储介绍