Android数据存储持久化技术

  使用Android应用程序过程中,会产生很多的数据,对于重要的数据,比如聊天消息、消费信息等,我们希望能够长久保存下来,否则这些数据(在内存中)会在程序关闭或者因其他原因导致内存被回收时而丢失,Android中持久化技术解决了这一难题。

  好吧,直接来看Android是怎么做的,写这篇文章的目的在于使用这些技术,并非应用场景,同时为了便于查阅这些知识点。如果能熟练使用这些技术,掌握这些技术的原理,自然能够去解决问题。

  Android中的持久化技术主要用三种方式实现。

1)文件储存

2)SharedPreferences储存

3)数据库存出

注:1)在Activity中不可避免的使用Context,那么Context和Activity之间有什么联系?实际上,Context是Activity的间接父类。所以Activity本身具有Activity的一切特性。在面向对象的程序中,对象是功能的基本单位。Context的中文翻译为“上下文”,需要深刻理解Context可以参考博客:https://blog.csdn.net/qinjuning/article/details/7310620(目前并不需要了解太多,了解太多反而麻烦)

2)在Context中提供了openFileInput(String fileName)和openFileOutput(String file)两个方法,分别用来获取FileInputStream对象和FileOutputStream对象。


第一中持久化技术:文本存储

代码:

public class MainActivity extends AppCompatActivity {

    private EditText edit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit = (EditText)findViewById(R.id.edit);

        String inputText = load();      //程序在打开时需要读取必要的数据,还原到原来的状态。比如QQ账号自动出现
        if (!TextUtils.isEmpty(inputText)){   //TextUtils类的isEmpty对象,可以进行两种控制判断,即当inputText为空串和null时都可以判断。
            edit.setText(inputText);
            edit.setSelection(inputText.length());
            Toast.makeText(this, "Restoring successed", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        String inputText = edit.getText().toString(); 
        save(inputText);        //程序退出时保存数据 
    }
//存储数据
public void save(String inputText){
    FileOutputStream out = null;
    BufferedWriter writer = null;
    try{
        out = openFileOutput("data", Context.MODE_PRIVATE); //文件的操作模式:MODE_PRIVATE(覆盖原有内容),MODE_APPEND(追加内容,不存在data文件就创建一个新文件)
        writer = new BufferedWriter(new OutputStreamWriter(out));
        writer.write(inputText);
     }catch (IOException e){
        e.printStackTrace();
     }finally {
        try {
            if (null != writer) {
            writer.close();
        }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
//读取数据
public String load(){
    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuilder content = new StringBuilder();
    try{
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while(null != (line = reader.readLine())){
            content.append(line);
        }
    }catch (IOException e){ e.printStackTrace();
    }finally {
        try{
            if(null != reader){
                reader.close();
            }
        }catch (IOException e){ e.printStackTrace();
        }
    }
    return content.toString();
}

打开File Explorer中的data文件,保存的内容如下:

  如何打开File Explorer,可以参考博客文章:https://blog.csdn.net/d13419467942/article/details/79973309


   这种实现还是很简单的,记住:对象是面向对象程序中的基本单位。最难的地方可能在于初次使用某个类创建对象时感到陌生,这个一回生二回熟就行了。就像我们认识新一个新同学,慢慢就相互了解了。最开始大家都很陌生。

 

第二种持久化技术——SharedPreferences存储

既然这种技术那么重要,先看代码,最后会发现它其实很简单:

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //直接向data文件中存储数据
        Button saveData = (Button)findViewById(R.id.save_data);
        saveData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
                editor.putString("name", "Tom");
                editor.putInt("age", 28);
                editor.putBoolean("married", false);
                editor.apply();   //调用apply方法将添加的数据提交,完成数据的存储。apply方法就是这个功能,使用者只需要了解它的功能就好,不必知道具体实现,这正是面向对象封装的一大特性
            }
        });

        //data文件中提取数据
        Button retoreData = (Button)findViewById(R.id.restore_data);
        retoreData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
                String name = pref.getString("name", "");
                int age = pref.getInt("age", 0);
                boolean married = pref.getBoolean("married", false);
                Log.d("MainActivity", "name is " + name);
                Log.d("MainActiviry", "age is " + age);
                Log.d("MainActivity", "married is " + married);
            }
        });
    }


}

储存数据的文件的截图:


运行结果:


  从文件的截图可知,保存的文件是一个HTML文档。说明了SharedPreferences储存的特点:1)以HTML文档储存,2)支持多种数据类型的储存,即当时储存的数据类型是什么,直接读取出来就是什么类型的, 3)使用键值对的方式进行储存。

  提醒:调用Context类中的getSharedPreferendes(String fileName, int MODE)方法可以获取文件data的SharedPref对象。


持久化技术三——SQLite数据库存储



最后总结一下


猜你喜欢

转载自blog.csdn.net/d13419467942/article/details/80151338