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//目录中,除了私有目录,应用程序还拥有/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-permissionandroid:name\=_"android.permission.READ_CONTACTS"_/

uses-permissionandroid:name\=_"android.permission.WRITE_CONTACTS"_/

参考资料:

http://blog.sina.com.cn/s/blog_683a8f650100u5nu.html

http://blog.csdn.net/rhljiayou/article/details/7100840

源码下载地址:

http://download.csdn.net/detail/sylcc_/4220362