Android 数据持久化

标签: android 数据 | 发表时间:2012-04-12 06:55 | 作者:sylcc_
出处:http://blog.csdn.net

在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


作者:sylcc_ 发表于2012-4-12 14:55:12 原文链接
阅读:3 评论:0 查看评论

相关 [android 数据] 推荐:

Android 数据持久化

- - CSDN博客推荐文章
在Android中,实现数据持久化主要有四种方式:Preferences,文件I/O,SQLite数据库,ContentProvider组件. 在我们 RUI中上述的几种方法都要涉及,其中LauncherProvider.java文件属于第四种,提供对数据库的一些操作,下面将重点介绍使用ContentProvider来实现数据持久化,其它方法将做简要介绍.

Android--用JSON解析数据

- - CSDN博客移动开发推荐文章
gson-1.7.1.jar,Gson在Android3.0以上才能直接使用,在3.0以下想使用可以从外部导入jar包. 下载链接: http://download.csdn.net/detail/zlqqhs/5075995. 新建工程,新建一个libs文件夹,将gson-1.7.1.jar复制到libs文件夹中.

Android数据库导出工具—ADEL

- - FreebuF.COM
ADEL(Android Data Extractor Lite)这款工具可自动导出Android 2.x移动设备的SQLite数据库,并且释放下载文件中的存储内容. 以下数据库会被ADEL导出 telephone and SIM-card information (e. IMSI and serial number) telephone book and call lists, calendar entries, SMS messages, GPS locations from different sources on the smartphone.

Android数据库升级实例

- - BlogJava-qileilove
  Andoird的SQLiteOpenHelper类中有一个onUpgrade方法. 经过实践,解决了我一连串的疑问:. 帮助文档里说的“数据库升级”是指什么.   你开发了一个程序,当前是1.0版本. 到1.1版本时,你在数据库的某个表中增加了一个字段. 那么软件1.0版本用的数据库在软件1.1版本就要被升级了.

浅谈Android数据库版本升级及数据的迁移

- - CSDN博客推荐文章
Android开发涉及到的数据库采用的是轻量级的SQLite3,而在实际开发中,在存储一些简单的数据,使用SharedPreferences就足够了,只有在存储数据结构稍微复杂的时候,才会使用数据库来存储. 而数据库表的设计往往不是一开始就非常完美,可能在应用版本开发迭代中,表的结构也需要调整,这时候就涉及到数据库升级的问题了.

Google公布Android数据,年增长250%,每天激活85万台Android设备

- - 36氪
今天,Google高级副总裁Andy Rubin在其 官方博客上公布了Android最近的增长数据,称Android已经成为一个高速增长的生态系统. Android设备的今年增长了250%,全球共有3亿台Android设备. 平均每天有85万台新设备被激活,其中圣诞节周激活设备数量就有370万台,去年12月中旬平均每天的激活设备还只有70万台.

Android市场动态呈现 最新数据抢先看

- Adam - cnBeta.COM
感谢@Android安卓星空 .的投递. 今天外媒发布了最新的谷歌Android市场的发展态势报告,截止到8月19日下午14时30分,Android市场共有5,705,662,851款应 用被下载. 自从安卓市场发布以来,业界就对它给予了很大的关注. 以下为外媒对安卓市场进行的最新数据统计,包括了应用和游戏的对比情况,每个月份应用的下 载情况,以及每天应用的上传情况.

基于 android 数据备份恢复的一种实现

- robin - IBM developerWorks 中国 : 文档库
移动互联网是一个新型的融合型网络,随着其高速的发展,将会有越来越多的 3G 手机用户,而手机中有许多重要的数据需要备份. 本文介绍了基于 android 备份恢复这些数据的一种实现方法.

数据显示Android“姜饼”系统用户数增多

- 扬 - cnBeta.COM
来自谷歌的最新数据显示,Android 2.3“姜饼”系统的用户数正逐渐增多. 目前,许多原本安装Android 2.2“冻酸奶”系统的设备都已经升级至2.3系统,这使得Android 2.3“姜饼”系统在所有Android设备中所占份额达到38.7%. 而Android 2.2“冻酸奶”系统的份额下降至45.3%.

解决Android横竖屏切换数据丢失问题

- - CSDN博客推荐文章
Android横竖屏切换时,当前的Activity会被销毁,然后Activity上面的数据将会全部丢失. 如Listview上面每个item的checkbox,横竖屏切换时,复选框就丢失所有选中信息. 在Androidmanifest.xml的activity标签中加入. 强制限制activity在横屏状态或者竖屏状态,不让activity进行横竖屏切换.