参考1;http://blog.csdn.net/sylcc_/article/details/7453829
在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中查看。
参考2:
http://www.cnblogs.com/weixing/p/3243115.html
补充:对于现在市面上很多Android设备,自带了一个大的存储空间,一般是8GB或16GB,并且又支持了Sdcard扩展,对于这样的设备,使用Enviroment.getExternalStorageDirectory()方法只能获取到设备自带的存储空间,对于另外扩展的Sdcard而言,需要修改路径。
继续参考:
http://www.jianshu.com/p/5fd3fac8f5f7
http://blog.csdn.net/itluochen/article/details/52605392
http://blog.csdn.net/hudashi/article/details/8037078