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' ?>
<map>
<long name="time" value="1462591746656" />
<string name="name">zhangsan</string>
<int name="age" value="30" />
</map>




取数据:

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



你可能感兴趣的:(数据库,sqlite,数据存储,Android数据存储)