使用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数据库存储
最后总结一下