Android 数据持久化
在Android中,实现数据持久化主要有四种方式:Preferences,文件I/O,SQLite数据库,ContentProvider组件。
在我们 RUI中上述的几种方法都要涉及,其中LauncherProvider.java文件属于第四种,提供对数据库的一些操作,下面将重点介绍使用ContentProvider来实现数据持久化,其它方法将做简要介绍。
1) 使用Preferences存储应用程序数据
Preferences是一种轻量级的数据存储机制,他将一些简单的数据类型的数据,包括boolean类型,int类型,float类型,long类型以及String类型的数据,以键值对的形式存储在应用程序的私有Preferences目录(/data/data/<包名>/shared_prefs/)中,这种Preferences机制广泛应用于存储应用程序中的配置信息。
写入数据:
sPrefs = PreferenceManager.getDefaultSharedPreferences(context);
sPrefs.edit().putInt(SCREEN_COUNT, count).commit();
查看Preferences中的数据的方法有两种,第一种是使用adb命令查看,第二是使用DDMS——>FileExplorer在目录/data/data/<包名>/shared_prefs/中Preferences导出来查看。
可以看到,Preferences中使用键值对存储信息的,里面存储long,int,boolean等信息。
2)文件I/O
Android平台主要通过java.io.FileInputStream和java.io.FileOutputStream这两个类来实现对文件的读写,java.io.File类则用来构造一个具体指向某个文件或者文件夹的对象。
需要注意的是:每个应用程序所在的包都会有一个私有的存储数据的目录,只有属于这个包中的应用程序才有写入的权限,每个包中应用程序的私有数据目录位于 Android系统中的绝对路径/data/data/<package>/目录中,除了私有目录,应用程序还拥有/sdcard目录即 Android设备上的SD卡的写入权限。文件系统中其他的系统目录,第三方应用程序都是不可写的。
在我们RUI中,下载推荐应用时,就是在SD卡中建立一个目录,将下载的apk放入该目录中,具体的实现可以查看com.rui.mid.launcher.service.download中的FileUtil.java文件。在该文件中有一个changeMode方法改变文件的权限(可读,可写,可执行),就是为了能让系统调用该apk,实现应用的安装。
3)SQLite数据库
当应用程序需要处理的数据量比较大时,为了更加合理地存储、管理、查询数据,我们往往使用关系数据库来存储数据。Android平台为开发者提供了SQLite数据库相关的API来实现对数据库操作的支持,开发人员可以很方便的使用这些API来对SQLite数据库进行创建、修改及查询等操作。Android系统的很多用户数据,如联系人信息,通话记录,短信息等,都是存储在SQLite数据库当中的,所以利用操作SQLite数据库的API可以同样方便的访问和修改这些数据。
在实际的应用程序编写中,为了更好的对SQlite数据的创建,打开,更改进行管理,往往会编写一个SQLiteOpenHelper的数据库辅助类来帮助我们创建和打开数据库。可以查考博客 http://blog.csdn.net/rhljiayou/article/details/7085347
利用SQLiteDatabase对象操作数据库,他除了提供execSQL()和rawQuery()这种直接对SQL语句解析的方法外,还针对insert,upate,delete,select等操作专门定义了相关的方法。
SQLite数据库的查看方法也有两种:第一使用SQLite常用命令;第二导出数据库,使用SQLiteManager来查看。如下图所示,在SQLiteManager中使用SQL语句查看数据库中内容。
4)ContentProvider
ContentProvider概念
1、 ContentProvider提供为存储和获取数据提供了统一的接口;
2、 使用ContentProvider可以在不同的应用程序之间共享数据
3、 Android为常见的一些数据提供了ContentPrivider(包括音频,视频,图片和通讯录等等)
ContentProvider使用表的形式来组织数据
Uri
1、 每一个ContentProvider都拥有一个公共的uri,这个uri用于表示这个ContentProvider所提供的数据
2、 Android所提供的ContentProvider都存放在android.provider包当中
Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider,对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
要操作contact表中id为10的记录的name字段,contact/10/name
要操作contact表中的所有记录,可以构建这样的路径:/contact
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uriuri=Uri.parse("content://com.changcheng.provider.contactprovider/contact")
ContentProvider所提供的函数:
1、 query():查询
2、 insert():插入
3、 update():更新
4、 delete():删除
5、 getType():得到数据类型
6、 onCreate():创建时的回调函数
实现ContentProvider的过程
1、 定义一个CONTENT_URI常量
2、 定义一个类,继承ContentProvider
3、 实现query,insert,update,delete,getType,onCreate方法
4、 在AndroidManifest.xml当中进行声明
下图是在一个应用使用ContentProvider来对数据库进行插入,查询所有,更新,查询所有的打印结果。源码可以在共享中的MyContentProvider中查看。
为了让其他程序更加方便地使用我们自己定义的ContentProvider,一般会将要用到的静态数据导出成JAR归档文件。如本实例中的将所用到的静态字段都放在类ContentData中。打包JAR文件的步骤如下:
1. 在项目文件夹上或ContentData文件上右键,选择Export
2. 在弹出的选择导出类型的对话框中,点击选择JAR file,然后点Next。
3. 在选择要导出的文件框中,只选择ContentData.java。找到Browse…按钮指定导出路径,点选Finish完成导出ContentData.jar
导出JAR文件后,若需要在其它应用程序中使用,只需要为该项目添加外部的归档文件即可。在该项目文件夹上右键找到Build path ——>Add External Archive,选择要添加的JAR文件即可。下图是在其它应用中使用ContentProvider来对数据库进行操作。
下图是在其它应用对数据库进行查询所有后的打印结果。具体源码可以查看共享文件中的ContentProviderTest工程。
注意:如果在其它应用程序中要加AndroidManifest.xml文件加入权限
<uses-permission android:name= "android.permission.READ_CONTACTS"/>
<uses-permission android:name= "android.permission.WRITE_CONTACTS"/>
参考资料:
http://blog.sina.com.cn/s/blog_683a8f650100u5nu.html
http://blog.csdn.net/rhljiayou/article/details/7100840