Android 数据持久化存储

一:数据持久化

何为数据持久化?就是在退出应用程序或重启设备后数据不会丢失,例如每次打开淘宝都可以查看购物车中添加的商品信息和订单情况。

在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"/>网络权限 ,具体网络请求实现可以用原生的也可以使用相应类库。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值