Android数据篇(一)
Android的四种数据存储方式:
1.SharedPreferences
2.SQLite
3.Content Provider
4.File
SharedPreferences:
1.是一种轻型的数据存储方式
2.本质是基于XML文件存储key-value键值对数据
3.通常用来存储一些简单的配置信息
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储和修改是通过Editor对象实现的。
实现SharedPreferences存储的步骤如下:
1.获得SharedPreferences的对象
2.获得SharedPreferences.Editor对象
3.通过Editor接口的putXxx方法保存key-value对 其中Xxx表示不同的数据类型
4.通过Editor接口的commit方法保存key-value对
// SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); SharedPreferences pref = getSharedPreferences("myPref", MODE_PRIVATE); Editor editor = pref.edit(); editor.putString("name", "zhangsan"); editor.putInt("age", 30); editor.putLong("time", System.currentTimeMillis()); editor.putBoolean("default", true); editor.commit(); editor.remove("default"); editor.commit();
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
取数据:
System.out.println(pref.getString("name", "")); System.out.println(pref.getInt("age", 0));
SQLite
1.轻量级 一个动态库、单文件
2.独立性 没有依赖、无需安装
3.隔离性 全部在一个文件夹中
4.跨平台
5.多语言接口 支持众多编程语言
关于事务处理的安全性问题:
-通过数据库上的独占性和共享锁来实现独立事务处理
-多个进程可以在同一时间c从同一数据库读取数据,但只有一个可以写入数据
SQLite支持NULL(空值)、INTEGER(整型值)、REAL(浮点值)、TEXT(字符串值)、BLOB(二进制对象)数据类型
动态数据类型(弱引用)
-当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储
在Android中如何使用SQLite:
-SQLiteDatabase
-SQLiteOpenHelper
SQLiteDatabase:
-提供了一些管理SQLite数据库的类
-提供创建、删除、执行SQL命令,并执行其他常见的数据库管理任务的方法
-每个程序的数据库名字是唯一的
.db.execSQL(String sql) // 执行任何SQL语句
.db.insert(String table, String nullColumnHack, ContentValues values)
.db.delete(String table, String whereClause, String[] whereArgs)
.db.update(String table, ContentValues values, String whereClause, String[] whereArgs)
.db.query(String table, String[] column, String selection, String[] selectionArgs, String groupBy, String having, String orderBy String limit)
.rawQuery(sql, selectionArgs)
Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cursor最终会被释放掉
然而如果Cursor的数据量特别大,特别的如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动
的将Cursor close掉,因为在源代码中我们发现,如果等到垃圾回收器来回收时,也就是如果不手动关闭,系统会报错,会给用户以错误提示。
Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等。
常用方法:
getCount() 总记录条数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列索引的String类型值
// 每个程序都有自己的数据库 默认情况下是各自互相不干扰 // 创建一个数据库 并且打开 SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null); // databases/user.db db.execSQL("create table if not exists usertb (_id integer primary key autoincrement, name text not null, age integer not null, sex text not null)"); db.execSQL("insert into usertb(name, sex, age) values('zhangsan', 'female', 18)"); db.execSQL("insert into usertb(name, sex, age) values('lisi', 'female', 19)"); db.execSQL("insert into usertb(name, sex, age) values('wangwu', 'male', 20)"); Cursor c = db.rawQuery("select * from usertb", null); if (c != null) { while (c.moveToNext()) { Log.i("info", "_id : " + c.getInt(c.getColumnIndex("_id"))); Log.i("info", "name : " + c.getString(c.getColumnIndex("name"))); Log.i("info", "age : " + c.getInt(c.getColumnIndex("age"))); Log.i("info", "sex : " + c.getString(c.getColumnIndex("sex"))); Log.i("info", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } c.close(); } db.close();
ContentValues:
-这个类是用来存储一组可以被ContentResolver处理的值。
ContentValues values = new ContentValues(); // 类似hashMap key value
values.put("name", "zhangsan");
执行对应的sql操作
SQLiteDatabase db = openOrCreateDatabase("stu.db", MODE_PRIVATE, null); db.execSQL("create table if not exists stutb(_id integer primary key autoincrement, name text not null, sex text not null, age integer not null)"); ContentValues values = new ContentValues(); values.put("name", "zhangsan"); values.put("sex", "male"); values.put("age", 19); db.insert("stutb", null, values); long rowId = db.insert("stutb", null, values); values.clear(); values.put("name", "zhangsanfeng"); values.put("sex", "male"); values.put("age", 99); db.insert("stutb", null, values); values.clear(); values.put("name", "lisi"); values.put("sex", "male"); values.put("age", 59); db.insert("stutb", null, values); values.clear(); values.put("name", "wangwu"); values.put("sex", "male"); values.put("age", 39); db.insert("stutb", null, values); values.clear(); values.put("name", "fengzi"); values.put("sex", "male"); values.put("age", 29); db.insert("stutb", null, values); values.clear(); values.put("sex", "female"); db.update("stutb", values, "_id > ?", new String[]{"3"}); // 将全部id > 3的人的性别改成女 db.delete("stutb", "name like ?", new String[]{"%si%"}); // 删除所有名字中带有si的人 Cursor c = db.query("stutb", null, "_id > ?", new String[]{"0"}, null, null, "name"); if (c != null) { String[] columns = c.getColumnNames(); while (c.moveToNext()) { for(String columnName : columns) { Log.i("info", c.getString(c.getColumnIndex(columnName))); } } c.close(); } db.close();
更多相关文章
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- python起点网月票榜字体反爬案例
- 《Android开发从零开始》——25.数据存储(4)
- Android系统配置数据库注释(settings.db)
- Android中不同应用间实现SharedPreferences数据共享
- android图表ichartjs
- Android内容提供者源码
- android SharedPreferences
- Android(安卓)Paging组件Demo