赞
踩
瞬时数据就是那些存储在内存中,有可能会因为程序关闭或其他原因导致被回收而丢失的数据。
数据持久化就是将那些内存中的瞬时数据保存到存储设备中,保证即使 在手机或计算机关机的情况下,这些数据仍然不会丢失。
保存在内存中的数据是处于瞬时状态的,保存在存储设备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状态间进行转换。Android系统中主要提供了3中方法:文件存储、SharedPerferences存储以及SQLite数据库存储。
我们可以借助Device File Explorer 工具查看。在Android Studio的右侧边栏中。也可以ctrl+Shift+A打开搜索功能。这个工具就相当于一个设备文件浏览器。
第二种存储用户数据的方式,使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而在Android中我们通常使用 一个轻量级的存储类——SharedPreferences来保存用户偏好的参数!SharedPreferences也是使用xml文件, 然后类似于Map集合,使用键-值的形式来存储数据;我们只需要调用SharedPreferences的getXxx(name), 就可以根据键获得对应的值!使用起来很方便!
在使用之前先要获取 SharedPreference对象。获取的方法有两种:
context类中的getSharedPreferences()
Activity 类中的 getPreferences()
得到 SharedPreference对象后就可以向 SharedPreference文件中存储数据了,步骤三步走:
范例:
SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("username", username);
editor.putString("passwd", passwd);
editor.commit();
SharedPreference文件是使用XML格式对数据进行管理的。
SharedPreference对象中提供了一系列的get方法,用于读取存储的数据,每种get方法都对应了SharedPreference.Editor中的一种put方法。get方法中传入两个参数,第一个是键,第二个是默认值,即在找不到键时返回的默认值。
范例:
Map<String, String> data = new HashMap<String, String>();
SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
data.put("username", sp.getString("username", ""));
data.put("passwd", sp.getString("passwd", ""));
先通过getSharedPreferences()方法得到了SharedPreference对象,然后调用相应的get方法。
SQLite是一个开源的嵌入式关系数据库,其可移植性好,易使用,高效,可靠。SQLite嵌入到使用它的应用程序中,他们共用相同的进程空间,而不是两个不同的进程。其支持多表和索引、事务、视图、触发。SQLite是无数据类型的数据库,就是字段不用指定类型,虽然SQLite可以忽略数据类型,但是通常会在Create Table语句中指定数据类型,因为数据类型可以告知这个字段的含义,便于对代码的阅读和理解。常见的数据类型如下:
Android 中提供了一个帮助类 android.database.sqlite.SQLiteOpenHelper。来实现对SQLite数据存储。SQLiteOpenHelper是一个抽象类必须实以下两个方法:
void onCreate(SQLiteDatabase db)
void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
范例:
public class DBHelper extends SQLiteOpenHelper { public DBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { //创建数据库sql语句并执行 String sql="create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
在范例中的构造方法中,调用了父类的构造方法:
SQLiteOpebHelper(Context context,String name,CursorFactory factory,int version)
第一个参数是上下文,第二个参数是数据文件的名字,第三个参数是CursorFactory对象,用来构造查询完成后返回的Cursor的子类对象为空的时候默认使用CursorFactory构造;第四个参数为数据库的版本号,用于更新数据库
在范例中
插入数据是通过 SQLiteDatabase 的 insert() 方法将数据插入到数据库中,插入 insert() 的方法有两个主要的形式:
public long insert(String table , String nullColumnHack , ContentValues values)
public long insertorThrow(String table , String nullColumnHack , ContentValues values)
这两个方法返回值都是整数,代表id,这个id是SQLite维护的,发生错情况返回-1。第一个参数是表名;第二个参数是指定一个列名,在SQL标准中不饿能插入全部字段为空的记录,但是又使用户需要插入全部字段为NULL值,然后再去执行SQL语句。一般情况下第三个参数有值的时候本参数传入null;第三个参数指定具体的字段的值,相当于map集合,键值对的形式存储。
范例:
DBOHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
//创建存放数据的ContentValues对象
ContentValues values = new ContentValues();
values.put("username","test");
values.put("password","123456");
values.put("age",20);
//数据库执行插入命令
db.insert("user", null, values);
首先声明一个实现了SQLiteOpenHelper的抽象类的成员变量实例化,然后通过getWritableDatabase()获取一个可写入的 SQLiteDatabase 对象。将准备好的数据放到 ContentValues 对象中,ContentValues 与 Map类似,通过put(key, values) 方法把数据放入。最后调用 SQLiteDatabase 对象的insert方法存入数据库
删除数据是通过 SQLiteDatabase 的 delete 方法:
public int delete(String table,String whereClause,String[] whereArgs)
第一个参数是表名;第二个参数是条件,可以带有占位符号(?);第三个参数是一个字符串数据,它为第二个参数提供数据,实际运行时候替换占位符号。方法返回值是证书,代表id,这个id是SQLite维护的,发生错误返回-1.
范例:
DBHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
db.delete("user", "username=?", new String[]{"test"});
修改数据是通过 SQLiteDatabase 提供的 updata 方法
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
该方法参数与 insert 和 delete 方法类似
范例:
DBHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
ContentValues values2 = new ContentValues();
values2.put("username", "admin123");
db.update("user", values2, "username=?", new String[]{"admin"});
查询数据是通过 SQLiteDatabase 提供的 query 方法,该方法返回游标(Cursor)对象,query方法有三个重载方法:
public Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy)
public Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
public Cursor query(boolean distinct, String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy,String limit)
范例:
DBHelper mdbHelper = new DBHelper(MainActivity.this,"users.db",null,1);
SQLiteDatabase db = mdbHelper.getWritableDatabase();
//创建游标对象
Cursor cursor = db.query("user", new String[]{"id","username","age"}, "username=?",
new String[]{"admin123"}, null, null, null);
//利用游标遍历所有数据对象
while(cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndex("id"));
String username = cursor.getString(cursor.getColumnIndex("username"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.i("Mainactivity","result: id=" + id +" username: " + username +" age:" + age);
}
// 关闭游标,释放资源
cursor.close();
查询结果返回的是一个游标对象,游标对象可以理解为一个二维表格,在游标中字段是通过query方法中的columns参数指定的。游标的相关方法列举如下:
isAfterLast()
isBeforeFirst()
move(int offest)
moveToFirst()
moveToLast()
moveToNext()
moveToPrevious
moveToPosition(int position)
getColumnCount()
getColumnIndex(String columnNmae)
getCount()
getFloat(int columnIndex)
getInt(int columnIndex)
getLong(int columnIndex)
getShort(int columnIndex)
getString(int columnIndex)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。