在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);

editor.commit();//提交保存.

取:

//取得活动的preferences对象.

SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);

// 取得值.

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_PRIVATE);

//操作时,在fos里写入值即可

l  读文件:

FileInputStream fis = openFileInput(FILE_NAME);

l  取得当前活动创建的文件列表:

String[] lst =fileList()

l  删除文件:

super.deleteFile(FILE_NAME);

(三)SQLite数据库操作

数据库操作无非是建库、建表、增、删、改、查的一些常用功能。在Android系统中封装了一个SQLiteDatabase类,用于这些操作。

建库

创建数据库,是由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。

建表

_db.execSQL(“create table tableName (id integer primary key autoincrement,name text not null);”);

看到,这个建表其实跟我们写的SQL很类似,只是可能一些语法细节不同,具体这个就不写了,google一下会N多了。

当然我们可以执行一条SQL语句来插入,我们也可以这样来:

ContentValues newTaskValues = 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表中,然后直接存入。

db.delete(tableName, "id=" + _rowIndex, null)

输入表名,以及条件,当然,直接拼成一条标准SQL也是可以的。

ContentValues newValue = new ContentValues();

newValue.put(KEY_TASK, _task);

db.update(DATABASE_TABLE, newValue,    KEY_ID + "=" + _rowIndex, null

将值存于Hash表中,再直接调用

Cursor result =db.query(DATABASE_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.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继承处理了哪些类:

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

@Override

public int delete(Uri uri, String selection, String[] selectionArgs)

@Override

public Uri insert(Uri uri, ContentValues values)

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs)

看到这些大家可能就更家明白了MyProvider就是一个数据的封装,它按照统一的接口来提供共享的数据,每一个Provider就是处理一类共享数据。

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

看到这个不知大家有没有想到我们前面取得电话薄信息时是不是用的“content:// Contacts/1”这样的Uri,对应起来咯。

看了具体的Provider的实现,我们又想到,那这个统一的数据接口标准到底能提供我们哪些功能呢,其实看了Provider内部实现,我们也发现了,不就也就是增、删、改、查么。对,我们可能通过统一的接口来对这公用数据进行这些操作。具体方法如下:

查询:

Cursor someRows = getContentResolver().query(MyProvider.CONTENT_URI,

null, where, null, order);

插入:

// Create a new row of values to insert.

ContentValues newValues = new ContentValues();

newValues.put(COLUMN_NAME, newValue);

Uri myRowUri = getContentResolver().insert(MyProvider.CONTENT_URI,newValues);

删除:

getContentResolver().delete(MyProvider.CONTENT_URI, where, null);

修改:

getContentResolver().update(MyProvider.CONTENT_URI, newValues, where,

null);

这些几个功能可以有点难理解,我们看个应用吧:

我想查询电话薄中姓陈的人的信息,然后再删除:

Cursor someRows = getContentResolver().query(“content:// Contacts”,

null, “name like ‘陈%’”, null, order);

//然后从游标中获取数据即可。

getContentResolver().delete(“content:// Contacts”, “name like ‘陈%’”, null);//删除

转载于:https://www.cnblogs.com/zjfstudio/archive/2009/06/01/3764724.html

Android学习——数据存储相关推荐

  1. android 储存方案,Android本地数据存储方案(一)

    Android系列的博客主要是记录和总结自己在平时学习之中遇到的问题,方便日后用到时查看,同时也希望对读者有所帮助.不足之处,欢迎指正~ 在说到Android数据存储之前,先提一下数据持久化,所谓数据 ...

  2. Android之数据存储-刘志远-专题视频课程

    Android之数据存储-17742人已学习 课程介绍         本课程介绍了Android中几种数据存储方式,让大家对Android中的数据存储一个系统的认识 课程收益     本课程介绍了A ...

  3. Android的数据存储和IO - 自动朗读(TTS)

    Android的数据存储和IO - 自动朗读(TTS) 自动朗读又是Android提供的另一种另类的IO,蛮不错的哦,支持对指定文本内容进朗读,学习完这个内容我立马就让它朗读:wwj is a goo ...

  4. android SharedPreferences数据存储

    android  SharedPreferences数据存储 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存 ...

  5. 005 Android之数据存储

    文章目录 Android文件系统 Android文件的访问权限 文件访问权限实例 数据存储方式 内部存储 内部存储实例 外部存储 Shared Preferences Shared Preferenc ...

  6. Android的数据存储之一------SharedPreferences

    下面将介绍下Android的数据存储,Android提供了5种方式存储数据: 1.SharedPreferences存储数据; 2.文件存储数据: 3.SQLite数据库存储数据: 4.使用Conte ...

  7. android常用的存储方式,Android 常见数据存储方式

    Android 常见数据存储方式有以下三种:1.使用SharedPreferences存储数据:其本质就是一个xml文件,可以保存字符串.布尔值.基础数据.集合等数据.常用于存储较简单的参数设置. 2 ...

  8. android app数据存储,基于Android开发的APP数据存储研究

    谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...

  9. Android常用数据存储之SharedPreferences存储和读取用法分享

    一:Android常用数据存储,一共有五种方式,分别是 1.SharedPreferences储存数据, 2.文件存储 3.SQLite数据存储 4.ContentProvider储存数据 5.网络存 ...

最新文章

  1. linix终端输入mysql,Linux服务器如何进入 MySQL 命令行
  2. 7款Flash和Javascript网页视频播放器
  3. Pessimistic Error Pruning example of C4.5
  4. 2016 hctf fheap 题解
  5. 软考系统架构师笔记-综合知识重点(三)
  6. Kotlin入门(2)让App开发变得更容易
  7. Shiro框架(一)-Shiro概述
  8. Python编程 介绍(入门)
  9. 百度干净云2.0无限速加速破解版(附怎么用教程)
  10. 【Proteus仿真】基于STC15单片机简易数码管定时器时钟
  11. 网页显示mysql数据库到表格数据_html表格显示数据库数据
  12. .net mysql sqlhelper_「谢灿asp.net三层架构」5、DAL中公共类-SqlHelper类应该这样写
  13. python画误差棒_Python数据处理从零开始----第四章(可视化)(3)散点图和误差棒...
  14. js 导出word文档
  15. 谷歌 地图 android studio,Android Studio百度地图开发(一)
  16. 【CNC——第9.1篇】使用Setup引导程序整定步进电机(开环步进电机整定方式之1)
  17. 超市结算系统|Springboot+Vue通用超市结算收银系统
  18. [日推荐]『质安查』买到放心的产品就靠它了
  19. Kubeadm初始化报错
  20. 视频教程-FFmpeg+OpenGL ES+OpenSL ES打造Android视频播放器-Android

热门文章

  1. Laravel 多用户认证
  2. openstack rabbitmq
  3. bash下: () {} [] [[]] (())的解释
  4. 菜鸟入门Java语言学习六大要点
  5. 脂肪粒和淋巴结肿大的外形可否区分
  6. xfce中的window manager
  7. 下采样downsample代码
  8. OpenGL画图设备上下文与MFC设备上下文的对应
  9. ffmpeg java 使用_macos下ffmpeg使用及java调用
  10. 深度学习(二十八)——SOM, Group Normalization, MobileNet, 花式卷积进阶