【Android源码 栏目提醒】:网学会员,鉴于大家对Android源码 十分关注,论文会员在此为大家搜集整理了“Android_数据存储 - 企业软件开发”一文,供大家参考学习!
在
Android中提供了三种数据存储的途径和两种存储方式。
三种途径 系统配置Shared Preferences 这类应用主要是系统的配置信息的保存比如我给程序界面设置了颜色我想在下一次启动时还是能够保留上次设置的颜色。
由于
Android系统的界面是采用Activity栈的形式在系统资源不足时会收回一些界面那么我想有些操作也是需要在不活动时保留下来的等再次激活时能够显示出来。
文件Files
Android是一个操作系统自然而然对存储系统会有一个管理因为采用提Linux核心所有在Andorid系统中文件也是Linux的形式。
当然我们的应用程序也就可以把数据以文件的形式记录下来咯。
数据库SQLite Databases 在Andriod系统中也少不了一个数据库管理但考虑到系统资源内存硬盘选择了轻便型的数据库SQLite这是一个开源的关系型数据库与普通关系型数据库一样也具有ACID的特性。
两种存储方式 主要是根据数据库共享方式来分 程序内自用 通常我们程序中需要的数据一般都是为本程序来用所以我们用上面三种途径来创建的程序都是默认为本程序使用其他程序无法获取操作。
我们ADB插件功能在命令行下输入adb shell 来进入手机的文件系统进入CD /data/data目录。
然后ls查看我们发现我们在系统中安装的每个程序在这里都有一个文件夹再次进入我们的程序后ls查看会出现几个目录shared_prefs、files、databases这几个目录其实就是存的我们程序内自用的数据内容分别就是由上面三种途径创建的当然如果没有创建过这个目录可能不存在。
数据需要共享 这类数据通常是我们的一些共用数据很多程序都会来调用比如电话薄数据就不可能存为私有的了。
当然这种方式的话上面三种途径中的系统配置就不适用了“系统配置”只能由本程序访问。
也就是说只有文件和数据库可以共享。
具体用没我们下面依次试一下 一系统配置 这类数据存储形式是NVP形式即name和value的映射map。
存 // 取得活动的preferences对象. SharedPreferences uiState getPreferences0 // 取得编辑对象 SharedPreferences.Editor editor uiState.edit // 添加值 editor.putStringKEY value editor.putBooleanKEY value editor.commit//提交保存. 取 //取得活动的preferences对象. SharedPreferences settings getPreferencesActivity.MODE_PRIVATE // 取得值. String value settings.getStringKEY 默认值 Boolean value settings.getBooleanKEY false 存取时间 有了存取的方法后我们就要想在什么时候来存取 protected void onPause//系统通知暂停可以保存设置 public void onDestroy//系统通知关闭可以保存设置 public void onCreateBundle savedInstanceState //系统启动可以打开设置 同样还有其他状态我们可以根据实际情况来处理 二文件操作 打开文件并可操作如果文件不存在会自动创建 FileOutputStream fos openFileOutputFILE_NAME Context.MODE_PRIVATE //操作时在fos里写入值即可 读文件 FileInputStream fis openFileInputFILE_NAME 取得当前活动创建的文件列表 String lst fileList 删除文件 super.deleteFileFILE_NAME 三SQLite数据库操作 数据库操作无非是建库、建表、增、删、改、查的一些常用功能。
在
Android系统中封装了一个SQLiteDatabase类用于这些操作。
建库 创建数据库是由SQLiteOpenHelper类自动完成同时创建后会返回一个SQLiteDatabase类 try SQLiteOpenHelper dbHelper new SQLiteOpenHelpercontextDBNamenull1 db dbHelper.getWritableDatabase catch SQLiteException ex db dbHelper.getReadableDatabase 其中参数DBName就是数据库的名称。
getWritableDatabase这方法就会获取数据库对象如果库不存在就会新建但这里为什么还要包一层catch呢主要考虑到手机的资源有限有时空间不足了就无法再写入数据但这里我们可以读啊所以在catch中调用了getReadableDatabase。
建表 _db.execSQL“create table tableName id integer primary key autoincrementname text not null” 看到这个建表其实跟我们写的SQL很类似只是可能一些语法细节不同。
增 当然我们可以执行一条SQL语句来插入我们也可以这样来 ContentValues newTaskValues new ContentValues // Assign values for each row. newTaskValues.putKEY_TASK value newTaskValues.putKEY_CREATION_DATE value // Insert the row. db.insertDATABASE_TABLE null newTaskValues 我们可以将值依次放入一个Hash表中然后直接存入。
删 db.deletetableName id _rowIndex null 输入表名以及条件当然直接拼成一条标准SQL也是可以的。
改 ContentValues newValue new ContentValues newValue.putKEY_TASK _task db.updateDATABASE_TABLE newValue KEY_ID _rowIndex null 将值存于Hash表中再直接调用 查 Cursor result db.queryDATABASE_TABLE new String KEY_ID KEY_TASK KEY_CREATION_DATE null 条件 null null null 这里查询后返回的是一个游标我们可以通过这游标来获取数据使用方法跟java通用程序一样。
还有更多的用法只有边用边再搜Google了 四Content Providers共享数据 在前面界面交互中我们也学习到了
Android系统的界面互相调用时传值是采用Uri的方式进行的。
表面上看Uri不就是一个字符串吗能传多少值啊其实不然在Uri中格式1://2/3这第一段我们不管这第二段其实在系统中是可以定义到我们的Content Providers的我们可以写一个类比如这个用来管理电话薄信息如 public class MyProvider extends ContentProvider private static final String myURI content://com.gmobilesoft.MyProvider/items public static final Uri CONTENT_URI Uri.parsemyURI … 在这里MyProvider继承了ContentProvider类然后我们在系统中注册一下在manifext.xml中 然后我们在传值时使用content://com.gmobilesoft.MyProvider/1来通过这个Uri我想得到电话薄中第一个人的信息我们分析一下这个最后一段“1”就是第一个记录咯“com.gmobilesoft.MyProvider”这个就是标记我用哪一套程序来取数据所以说我们写的MyProvider就可以根据传入的“1”这个参数来进行数据的操作这里你可以保存到文件中也可以保存到数据库中但对使用者来说是透明的不需要知道内部细节。
这就是我们说的数据共享模型。
我们进一步看MyProvider继承处理了哪些类 Override public Cursor queryUri uri String projection String selection String selectionArgs String sortOrder Override public int deleteUri uri String selection String selectionArgs Override public Uri insertUri uri ContentValues values Override public int updateUri uri ContentValues values String selection String selectionArgs 看到这些大家可能就更家明白了MyProvider就是一个数据的封装它按照统一的接口来提供共享的数据每一个Provider就是处理一类共享数据。
当然系统中其实己经供了这样的一些Provider供我们来使用比如Browser记录了用户浏览记录CallLog记录系统日志Contacts电话薄Settings系统设置等。
看到这个不知大家有没有想到我们前面取得电话薄信息时是不是用的“content:// Contacts/1”这样的Uri对应起来咯。
看了具体的Provider的实现我们又想到那这个统一的数据接口标准到底能提供我们哪些功能呢其实看了Provider内部实现我们也发现了不就也就是增、删、改、查么。
对我们可能通过统一的接口来对这公用数据进行这些操作。
具体方法如下 查询 Cursor someRows getContentResolver.queryMyProvider.CONTENT_URI null where null order 插入 // Create a new row of values to insert. ContentValues newValues new ContentValues newValues.putCOLUMN_NAME newValue Uri myRowUri getContentResolver.insertMyProvider.CONTENT_URInewValues 删除 getContentResolver.deleteMyProvider.CONTENT_URI where null 修改 getContentResolver.updateMyProvider.CONTENT_URI newValues where null 这些几个功能可以有点难理解我们看个应用吧 我想查询电话薄中姓陈的人的信息然后再删除 Cursor someRows getContentResolver.query“content:// Contacts” null “name like ‘陈’” null order //然后从游标中获取数据即可。
getContentResolver.delete“content:// Contacts” “name like ‘陈’” null//删除