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' ?>zhangsan




取数据:

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



更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 《Android开发从零开始》——25.数据存储(4)
  4. Android系统配置数据库注释(settings.db)
  5. Android中不同应用间实现SharedPreferences数据共享
  6. android图表ichartjs
  7. Android内容提供者源码
  8. android SharedPreferences
  9. Android(安卓)Paging组件Demo

随机推荐

  1. 30个高质量并且免费的Android图标【Andro
  2. 《android framework常用api源码分析》之
  3. Android 中的注解详细介绍
  4. Android 获取手机存储信息详解(内存,外存等
  5. Delphi XE5 for Android(安卓)(七)
  6. Android智能手机搜索不到路由器无线信号
  7. 关于android的广播接收器(1)—基础篇
  8. Android的消息机制之Handler源码解析
  9. mac 系统下android源码下载以及使用(总结)
  10. Android NDK开发学习(一)