android数据存储

  • 格式:doc
  • 大小:52.50 KB
  • 文档页数:8

在Android中,提供了三种数据存储的途径,和两种存储方式。

三种途径:l 系统配置(Shared Preferences):这类应用主要是系统的配置信息的保存,比如我给程序界面设置了颜色,我想在下一次启动时还是能够保留上次设置的颜色。

由于Android系统的界面是采用Activity栈的形式,在系统资源不足时,会收回一些界面,那么,我想有些操作也是需要在不活动时保留下来的,等再次激活时能够显示出来。

l 文件(Files)Android是一个操作系统,自然而然对存储系统会有一个管理,因为采用提Linux核心,所有在Andorid系统中,文件也是Linux的形式。

当然我们的应用程序也就可以把数据以文件的形式记录下来咯。

l 数据库(SQLite Databases)在Andriod系统中,也少不了一个数据库管理,但考虑到系统资源(内存,硬盘),选择了轻便型的数据库SQLite,这是一个开源的关系型数据库,与普通关系型数据库一样,也具有ACID的特性。

两种存储方式:主要是根据数据库共享方式来分l 程序内自用:通常我们程序中需要的数据一般都是为本程序来用,所以我们用上面三种途径来创建的程序都是默认为本程序使用,其他程序无法获取操作。

我们ADB插件功能在命令行下输入:adb shell 来进入手机的文件系统,进入CD /data/data 目录。

然后ls查看,我们发现,我们在系统中安装的每个程序在这里都有一个文件夹,再次进入我们的程序后ls查看,会出现几个目录:shared_prefs、files、databases,这几个目录其实就是存的我们程序内自用的数据,内容分别就是由上面三种途径创建的,当然如果没有创建过,这个目录可能不存在。

l 数据需要共享:这类数据通常是我们的一些共用数据,很多程序都会来调用,比如电话薄数据,就不可能存为私有的了。

当然,这种方式的话,上面三种途径中的系统配置就不适用了,“系统配置”只能由本程序访问。

也就是说,只有文件和数据库可以共享。

具体用没我们下面依次试一下:(一)系统配置这类数据存储形式是NVP形式即,name和value的映射map。

存:// 取得活动的preferences对象.SharedPreferences uiState = getPreferences(0);// 取得编辑对象SharedPreferences.Editor editor = uiState.edit();// 添加值editor.putString(KEY, value);editor.putBoolean(KEY, value);mit();//提交保存.取://取得活动的preferences对象.SharedPreferences settings = getPreferences(Activity.MODE_PRIV A TE);// 取得值.String value = settings.getString(KEY, "默认值");Boolean value = settings.getBoolean(KEY, false);存取时间:有了存取的方法后,我们就要想在什么时候来存取:protected void onPause()//系统通知暂停,可以保存设置public void onDestroy()//系统通知关闭,可以保存设置public void onCreate(Bundle savedInstanceState) //系统启动,可以打开设置同样还有其他状态,我们可以根据实际情况来处理(二)文件操作l 打开文件并可操作,如果文件不存在会自动创建:FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVA TE);//操作时,在fos里写入值即可l 读文件:FileInputStream fis = openFileInput(FILE_NAME);l 取得当前活动创建的文件列表:String[] lst =fileList()l 删除文件:super.deleteFile(FILE_NAME);(三)SQLite数据库操作数据库操作无非是建库、建表、增、删、改、查的一些常用功能。

在Android系统中封装了一个SQLiteDatabase类,用于这些操作。

l 建库创建数据库,是由SQLiteOpenHelper类自动完成,同时,创建后,会返回一个SQLiteDatabase 类:try {SQLiteOpenHelper dbHelper= new SQLiteOpenHelper(context,DBName,null,1);db = dbHelper.getWritableDatabase();} catch (SQLiteException ex) {db = dbHelper.getReadableDatabase();}其中参数DBName就是数据库的名称。

getWritableDatabase(),这方法就会获取数据库对象,如果库不存在就会新建,但这里为什么还要包一层catch呢,主要考虑到,手机的资源有限,有时空间不足了,就无法再写入数据,但这里我们可以读啊,所以在catch中调用了getReadableDatabase。

l 建表_db.execSQL(“create table tableName (id integer primary key autoincrement,name text not null);”);看到,这个建表其实跟我们写的SQL很类似,只是可能一些语法细节不同,具体这个就不写了,google一下会N多了。

l 增当然我们可以执行一条SQL语句来插入,我们也可以这样来:ContentV alues newTaskV alues = new ContentValues();// Assign values for each row.newTaskValues.put(KEY_TASK, value);newTaskValues.put(KEY_CREATION_DATE, value);// Insert the row.db.insert(DATABASE_TABLE, null, newTaskValues);我们可以将值依次放入一个Hash表中,然后直接存入。

l 删db.delete(tableName, "id=" + _rowIndex, null)输入表名,以及条件,当然,直接拼成一条标准SQL也是可以的。

l 改ContentV alues newV alue = new ContentValues();newValue.put(KEY_TASK, _task);db.update(DATABASE_TABLE, newValue, KEY_ID + "=" + _rowIndex, null 将值存于Hash表中,再直接调用l 查Cursor result =db.query(DATABASE_TABLE,new String[] { KEY_ID, KEY_TASK, KEY_CREATION_DA TE},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.zjf.MyProvider/items";public static final Uri CONTENT_URI = Uri.parse(myURI);…}在这里MyProvider继承了ContentProvider类,然后我们在系统中注册一下(在manifext.xml 中):<provider android:name=”MyProvider”android:authorities=” com.zjf.MyProvider”/>然后我们在传值时使用:content://com.zjf.MyProvider/1来通过这个Uri我想得到电话薄中第一个人的信息,我们分析一下,这个最后一段“1”,就是第一个记录咯,“com.zjf.MyProvider”这个就是标记我用哪一套程序来取数据,所以说,我们写的MyProvider就可以根据传入的“1”这个参数来进行数据的操作,这里你可以保存到文件中,也可以保存到数据库中,但对使用者来说是透明的,不需要知道内部细节。

这就是我们说的数据共享模型。

我们进一步看MyProvider继承处理了哪些类:@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs)@Overridepublic Uri insert(Uri uri, ContentValues values)@Overridepublic int update(Uri uri, ContentV alues values, String selection,String[] selectionArgs)看到这些大家可能就更家明白了MyProvider就是一个数据的封装,它按照统一的接口来提供共享的数据,每一个Provider就是处理一类共享数据。

当然系统中其实己经供了这样的一些Provider供我们来使用,比如:Browser记录了用户浏览记录;CallLog记录系统日志;Contacts电话薄;Settings系统设置等。