一:数据持久化
何为数据持久化?就是在退出应用程序或重启设备后数据不会丢失,例如每次打开淘宝都可以查看购物车中添加的商品信息和订单情况。
在Android中数据持久化实现方式分为内部存储、外部存储、及网络数据,本章节根据数据持久化的方式对数据的存和取进行一一讲解。
二:数据持久化方式
1:内部存储
内部存储方式创建的所有文件都在和应用包名相同的目录下,默认只有当前应用可以访问这些数据,当前应用程序卸载之后,这些数据也会被删除。在正常设备中无权限查看此目录中的内容,root之后是可以的。
- File文件存储
根据Android系统提供的方法openFileOutPut()默认存储文件的路径是/data/data/packageName/files/目录下,当然也可以自定义存储路径,通过new File()方法。这里只针对默认的创建方式举例说明:
文件的保存:
openFileOutPut()方法的第一参数为文件名称,第二个参数为保存文件的模式,操作模式分很多种。
MODE_PRIVATE是默认的操作模式,表示当文件存在的时候将覆盖原有的数据 ;
MODE_APPEND表示当文件不存在时则创建,存在时则追加数据 。
文件的读取:
- SharedPreferences存储
SharedPreferences是使用键值对的方式来存储数据的,根据键读取相应的值,生成的xml文件存储目录为/data/data/packageName/shared_prefs/目录下 。
1 > 存储方式
存数据时需要先得到SharedPreferences对象,然后再得到SharedPreferences.Edit对象edit , 以edit.putxxx(key,value)方法添加数据,最后用apply()提交数据;获取数据时用SharedPreferences对象的getxx(key,default)方法,default代表根据数据类型自定义的默认值,如果根据key得到的值是空那就返回default定义的值 。
2 > 获取SharedPreferences的方式分为:
context.getSharedPreferences() :
第一个参数为文件名,当前文件不存在则会先创建文件;第二个参数为操作模式,当前默认操作模式为Context.MODE_PRIVATE,表示只有当前应用程序可以对此文件进行读写,与直接传0意思一样 。
((Activity)context).getPreferences():
以默认操作模式做为参数,生成当前Activity名的xml文件 。
PreferenceManager.getDefaultSharedPreferences() :
Context作为参数,生成以当前包名为前缀的xml文件,packageName_preferences.xml
3 > 存储例子:
4> 读取例子:
- SQLite数据库存储
SQLite是Android内置轻量级数据库,运算速度快,占用资源少,用标准的SQL语法实现相关功能 。数据库存放位置/data/data/packageName/databases/xx.db。
每一个SQLite数据库都有一个叫sqlite_master的系统表,表内存储当前数据库中所有表的相关信息,表名、索引、用于创建此表的sql语句等,sqlite_master只能读取,不能做其他操作;另一个表sqlite_temp_master存储的是所有的临时表,表的结构与sqliter_master一致。
创建数据库及数据表成功后就可以对数据进行操作,分为C=添加/insert;R=查询/select;U=更新/update;D=删除/delete,使用对应的SQL语句实现。借助生成的SQLiteDatabase对象完成CRUD的操作。
1 > 创建数据库
通过实现SQLiteOpenHelper抽象类完成数据库的创建与升级,SQLiteOpenHelper抽象类中的两个抽象方法onCreate() 和onUpgrade(),一般在重写onCreate()方法时实现创建表的逻辑 。
2 > 查看数据库文件(设备需要root)
adb命令查看:
工具查看:
3 > 查看数据表是否存在
4 > 插入表数据
代码插入:
命令行插入:
5 > 查看表数据
代码查看:
命令查看:
6 > 删除表/表数据
删除单条数据:
删除所有数据:
删除表:
7 > 更新数据库
更新数据库最初方式,直接在onUpgrade()方法中添加如下语句,如果表存在则将原表删除重新调用onCreate()方法进行创建
初始化时更改下数据库版本号:
但这样会有一个问题,添加新表会删除之前表及表数据,导致原有数据清空,升级数据库一般都会保留原数据。如果直接从v1版升级到v2版,就从当前数据库版本为DEFAULT_VERSION=1,更新至NEW_VERSION=2,那就直接调用onUpgrade()方法,在方法内部判断版本号,如果新版本号>旧版本号,并且旧版本号与DEFAULT_VERSION相等那就在原数据库中再添加一个Book表;
如果直接安装v2版本,那直接调用onCreate() -->onUpgrade()方法,onUpgrade()实现同上,如果多次升级数据库那就可以根据对应版本号做相应更改的操作。
这时查看下user.db数据库中的表,可以看到包含Book与User:
查看Book表中也成功添加了一条数据
8 > 更新表数据
代码更新:
更新结果:
命令更新:
也可以用SQLiteDatabase的execSQL(sql)执行Sql语句来完成CRUD的操作,这里就不详细说了。
2:外部存储
外部存储一般是存储在sdcard上,任何有sdcard访问权限的应用均可以对数据进行访问,外部存储需要申请读写权限 ,否则访问时会抛异常。
- SdCard存储
3:网络数据
有些数据需要实时更新,那用内部或外部存储工作量会很大,所占空间也大,这时通过网络请求向服务端请求所需要的数据会方便很多,需要指定<uses-permission android:name="android.permission.INTERNET"/>网络权限 ,具体网络请求实现可以用原生的也可以使用相应类库。