数据存储

来源:互联网 发布:咋么样开淘宝店 编辑:程序博客网 时间:2024/06/04 18:21

数据存储

四种存储方式

  1. SharedPreferences

  2. SQLite

  3. Content Provider

  4. File

SharedPreferences

  1. 它是一个轻型的数据存储方式,存放在app的data数据下

  2. 本质是基于xml文件存储key-value键值对数据

  3. 通常用来存储一些简单类型的配置信息(窗口状态,设置信息)(复杂对象通过base64转换)

  4. SharedPreferences对象只能获取数据而不能保存或者更改,存储修改通过Editor对象实现

  5. 实现SharedPreferences存储的步骤如下:

    • 获得SharedPreferences对象

    • 获得SharedPreferences.Editor对象

    • 通过Editor接口的putXX方法保存(xx表示不同的数据类型)

    • 最后提交更改Editor.commit()方法(每次更改最后)

SQLite

SQlite是Hipp用C语言编写的开源的嵌入式数据库引擎,支持大多数SQL92标准,可以在所有的主要操作系统上运行。

支持高达2TB大小的数据库,以单个文件形式存在,以B-Tree的数据结构形式存储在磁盘。

主要特点:

  1. 轻量级 一个动态库,单文件

  2. 独立性 没有依赖,无需安装

  3. 隔离性 全部在一个文件夹中

  4. 跨平台 支持多个操作系统

  5. 多语言接口 支持众多编程语言

  6. 安全性 事务

关于事务处理的安全性问题:

  • 通过数据库上的独立性和共享锁来实现独立事务处理

  • 多个进程可以在同一时间读取数据,但是只有一个可以写入数据(保证安全性,牺牲效率)

支持的数据类型:

  • 支持NULL,INTEGER,REAL,TEXT,和BLOB类型

  • 依次为空值,整型值,浮点值,字符串值,二进制值

动态数据类型(弱引用)

  • 当某个值插入到数据库时,SQLite会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试着将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。

使用须知:

  • 资源占用少,性能良好和零管理成本,嵌入式数据库有了它的用武之地。如android,ios

  • 没有可用于sqlite的网络服务器,只能通过网络共享可能存在文件锁定或性能问题

  • 只提供数据库级的锁定

  • 没有用户账户概念,而是根据文件系统确定所有数据库的权限

如何去使用SQLite:

  • SQLiteDatabase:提供管理数据库的类,提供创建,删除,执行sql命令,并执行其它常见的数据库管理任务的方法,每个程序的数据库名字唯一的。

  • Cursor是android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cursor最终被释放掉。然而如果Cursor的数据量特别大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC(garbage collection)来处理,并且android倾向于用户手动释放掉,如果等待GC来回收时,系统会报错,给用户错误提示。

  • 查询返回的Cursor默认是在index为-1的地方。

  • ContentValues是用来存储一组可以被ContentResolver处理的值

  • SQliteOpenHelper是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新,一般是建立一个类来继承它,并重写onCreate()和onUpgrade()方法。

    • onCreate(SQLiteDatabase db) 创建数据库时调用

    • onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 版本更新时调用

    • getReadableDatabase() 创建或打开一个只读数据库(会和writable是相同的对象除非一些问题如磁盘满了会返回一个只读数据库)

    • getWritableDatabase() 创建或打开一个读写数据库

文件存储

利用openFileOutput和openFileInput类进行文件读写,大部分文件操作和java类似,应用在安装时系统会分配给他一个userid,当该应用去访问其它资源文件时候会进行userid匹配,默认情况下,任何应用创建的文件,sharedPreferences,数据库都是私有的(位于data/data/包名/files),其它程序无法访问,除非创建时候指定为MODE_WORLD_READABLE或者MDOE_WORLD_WRITEABLE,这样其它应用才能访问。

ContentProvider

用来进行应用间数据共享

uri是通用资源标志符,格式类似content://com.example.Myprovider/music/#

  • content://前缀表示数据受控于一个内容提供者,固定schema

  • com.example.Myprovider是指在AndroidMainfest.xml中我们注册的provider的android:authorities属性对应的值

  • 具体操作哪个条目

  • 具体指定哪个条目下面的记录(#表示通配符)

怎么去解析Uri?我们可以使用UriMatcher类

  • UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);参数表示不匹配任何路径的返回码

  • matcher.addURI(“com.example.Myprovider”,”music”,1);

    • 往UriMatcher类添加一个拼凑的Uri

    • UriMatcher作为一个Uri容器,容器里包含这我们即将可能要操作的Uri

    • 如果通过match()方法匹配成功就返回code值,失败即-1

  • matcher.match(uri)寻找通过addURI方法加进来的Uri匹配,成功返回code值,失败返回UriMatcher.NO_MATCH常量(-1)

外部应用可以使用ContentResolver来操作ContentProvider中的数据,使用Activity提供的getContentResolver()方法来获取对象,它里面提供了ContentProvider类相同签名的四个方法.(insert,delete,update,query)

系统提供常见的contentProvider 联系人,短信,通话记录,多媒体(图片,视频,音频)

0 0
原创粉丝点击