# 数据存储

# Android中提供哪些数据持久存储的方法

  • 文件存储
  • SharedPreference存储
  • 数据库存储
  • ContentProvider存储
  • 网络存储

# 文件存储

文件存储是通过文件的方式将数据不做任何处理的存储进文件系统中,适合一些简单的文本数据或者二进制数据。主要是通过文件IO流的存储提供了FileInputStream()FileOutputStream()方法来存储和提取文件中的数据。

# SharedPreferences存储

SharedPreferences的存储数据和读取数据十分简单,提供了getput方法。

# 数据库存储

Android自身就支持SQLite这种轻量级的数据库。

# ContentProvider存储

之所以不选择与数据库直接交互,而选择通过ContentProvider进行交互,是因为Android的安全性问题决定的。它的数据库是私有的,所以外部数据无法直接访问这个数据库。而通过ContentProvider,将数据库的内容提供给外部应用,同时将外部应用的数据存储到数据库中。如果外部应用想要操作数据库暴露的数据时,需要ContentResolver来操作ContentProvider暴露的数据。一旦某个应用通过ContentProvider暴露了数据,那么不管该应用程序是否启动,其他的应用都能通过该接口操作暴露的数据,对数据进行增删查改的操作。

# 网络存储

Android提供了通过网络来实现数据的存储和获取的方法,即将数据存储在网络(服务器)中。

# SharedPreferences适用情形?使用中需要注意什么?

SharedPreferences是Android平台上一个轻量级的存储辅助类,特别适合保存软件的配置参数。它提供了stringsetintlongfloatboolean六种数据类型,它是以key-value的形式保存在 data/data/<packagename>/shared_prefs 下的xml文件中。

由于系统对SharedPreferences的读/写有一定的缓存策略,即在内存中有一份该文件的缓存,因此在多进程模式下,其读/写会变得不可靠,甚至丢失数据。

注意

  • SharedPreferences是以单例形式存在的
  • 创建sp单例是将文件的内容全部都载入内存中
  • 单进程下读取安全
  • apply()异步提交的方法代替commit
  • 因为sp的数据常驻内存,所以不适合存储过大的数据(例如接口数据,达到了MB的级别)

# SQLite的事务处理?是如何做的?

SQLite在做CRUD操作时都默认开启了事务,然后把SQL语句翻译成对应的SQLiteStatement并调用其相应的CRUD方法,此时整个操作还是在rollback journal这个临时文件上进行,只有操作顺利完成才会更新.db数据库,否则会被回滚。