android笔记-数据篇

Android 的四种数据存储方式:

  1. SharedPreferences
  2. SQLLite
  3. Content Provider
  4. File
  5. SharedPreferences

SharedPreferences

它是一种轻量的数据存储方式,本质是基于xml文件存储key-value,通常用来存储一些简单的配置信息。
SharedPreferences对象本身只对获取数据而不支持存储和修改,存储修改是通过Editor对象实现
实现SharedPreferences存储的步骤如下:

  1. 获取SharedPreferences对象
  2. 获取SharedPreferences.Editor对象
  3. 通过Editor接口的putXxx方法保存key-value对其中xxx表示不同的数据类型
  4. 通过Editor接口的apply(以前commit)方法保存key-value对
1
2
3
4
5
6
7
8
9
10
11
12
SharedPreferences pref = getSharedPreferences("myPref", MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putString("name", "jason");
edit.putInt("age", 28);
edit.putLong("time", System.currentTimeMillis());
edit.apply();//保存数据,建议不要用commit
edit.remove("time");
edit.apply();
//获取数据
System.out.println(pref.getString("name", "jason"));
System.out.println(pref.getInt("age", 0));

SQLite

SQLite简介

维基定义:

SQLite (英语发音:/ˌɛskjuːɛlˈlaɪt/[2] or 英语发音:/ˈsiːkwəl.laɪt/[3])是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中。与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。

SQLite遵守ACID,实现了大多数SQL标准。它使用动态的、弱类型的SQL语法。[4]它作为嵌入式数据库,是应用程序,如网页浏览器,在本地/客户端存储数据的常见选择。它可能是最广泛部署的数据库引擎,因为它正在被一些流行的浏览器、操作系统、嵌入式系统所使用[5]。同时,它有许多程序设计语言的语言绑定。

特点:

  • 轻量级 一个动态库、单个文件
  • 独立性 没有依赖、无序安装
  • 隔离性 全部在一个文件中
  • 跨平台
  • 多语言接口 支持众多编程语言
  • 安全性 事务

事务处理的安全性问题:

  • 通过数据库上的独占性和共享锁来实现独立事务处理
  • 多个进程可以在同一时间从同一数据库读取数据, 但只有一个可以写入数据。

    数据类型

    SQLite支持NULL、INTERGER、REAL、TEXT和BLOB数据类型

    动态数据类型

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

    差异性

  • 没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题
  • 只是提供数据库级别的锁定
  • 没有用户账号的概念,而是根据文件系统确定所有数据库的权限

android中如何使用SQLite

SQLiteDatabase

提供了一些管理SQLite数据库的类,提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法,每个程序的数据库名字是唯一的。

  1. ContentValues values = new ContentValues();
  2. values.put(“name”, “jason”);
  3. 执行对应的sql操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null);
//通过内置方法操作数据库
ContentValues values = new ContentValues();
values.put("name", "jason");
values.put("sex", "male");
values.put("age", "28");
db.insert("usertb", null, values);
values.clear();
values.put("sex", "female");
db.update("usertab", values, "_id>?", new String[]{"1"});//将全部id>3的人的性别改为女
db.delete("usertab", "name like ?", new String[]{"%j%"});//删除所有名字中带有j的人
//Cursor query = db.query("usertb", null, "_id>?", new String[]{"0"}, null, null, "name");
Cursor cursor = db.rawQuery("select * from usertb", null);
if(cursor != null) {
cursor.moveToFirst();
int index = cursor.getColumnIndex("_id");
while (cursor.moveToNext()) {
Log.i("jason", String.valueOf(cursor.getInt(index)));
}
cursor.close();
}
db.close();

TODO SQLiteOpenHelper

用于管理创建和版本更新
一般是建立一个类的继承它,并重写onCreate()和onUpgrade()方法
getReadableDatabase() 创建或打开一个只读数据库
getWriteableDatabase() 创建或打开一个读写数据库

SQlite 性能优化

技术小黑屋的一篇《Android中SQLite性能优化》写的不错,点击这里

TODO File

TODO ContentProvider

主要作用是进行数据共享,可以是不同进程、应用之间。

如何实现Content Provider?

  1. 继承抽象类ContentProvider实现一系列针对于数据的增、删、改、查等方法
  2. 需在AndroidMainfest.xml中完成对ContentProvider的注册
  3. 获取UriMatcher类
  4. 使用ContentResolver操作ContentProvider中的数据

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成
使用Activity提供的getContentResolver()方法获取ContentProvider对象

系统提供的ContentProvider

联系人
短信读取
通话记录
多媒体 图像、音视频

JasonThink wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!