SharePreference
保存较小的 key-value 集合,提供读写功能。
基本使用
String name = "sp_test";
String key = "test_key";
SharedPreferences sp = this.getSharedPreferences(name,Context.MODE_PRIVATE);
// 写SharePreference
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, "test_value");
boolean flag = editor.commit();
String value = "";
if(flag) {
// 读SharedPreference
sp.getString(key, "null_string");
}
Log.d(key, value);
保存的文件在 data/
commit 和 apply
commit方法有boolean返回值,表示保存是否成功的.
apply方法是void的.
commit方法是同步执行保存.
apply方法是异步执行保存
如不关心是否保存成功,就可以用异步的apply方法,相反,在乎保存返回值的,则用commit方法.如果出现并发情况,那么肯定是用异步的apply方法,这是如果用了commit方法的话,就有可能会导致阻塞. apply方法是现将数据立马存到内存中,然后会异步的去保存到目录文件去.
文件
SQLite
创建数据库类
/**
* SQLite数据库的帮助类
* 该类属于扩展类,主要承担数据库初始化和版本升级使用,其他核心全由核心父类完成
*/
public class UserDataBaseHelper extends SQLiteOpenHelper {
private static String db_name = "t_user.db";
public static final String TABLE_USER_CONFIG = "t_userconfig";
private static int version = 1;
public UserDataBaseHelper(Context context) {
super(context, db_name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS [" + TABLE_USER_CONFIG + "] ([_id] INTEGER PRIMARY KEY AUTOINCREMENT," +
"[uid] text UNIQUE," +
"[time] text," +
"[access_token] text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
获取数据库操作句柄
SQLiteDatabase db = new UserDataBaseHelper(context).getWritableDatabase();
getReadableDatabase() 创建或打开一个只读数据库
getWritableDatabase() 创建或打开一个读写数据库
SQLiteDatabase类为我们提供了很多种方法,而较常用的方法如下
返回值 | 方法名 | 方法描述 |
---|---|---|
(int) | delete(String table,String whereClause,String[] whereArgs) | 删除数据行的便捷方法 |
(long) | insert(String table,String nullColumnHack,ContentValues values) | 添加数据行的便捷方法 |
(int) | update(String table, ContentValues values, String whereClause, String[] whereArgs) | 更新数据行的便捷方法 |
(void) | execSQL(String sql) | 执行一个SQL语句,可以是一个select或其他的sql语句 |
(void) | close() | 关闭数据库 |
(Cursor) | query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) | 查询指定的数据表返回一个带游标的数据集 |
(Cursor) | rawQuery(String sql, String[] selectionArgs) | 运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别就是防止SQL注入) |
操作数据
// 用于更新数据
public boolean saveOrUpdateUser(TUser user) {
boolean flag = false;
if (existUser(user)) {
flag = updateUser(user);
} else {
flag = saveUser(user);
}
return flag;
}
// 保存数据
public boolean saveUser(TUser user) {
try {
ContentValues cv = new ContentValues();
cv.put("uid", user.uid);
cv.put("access_token", user.access_token);
String time = System.currentTimeMillis()+"";
cv.put("time", time);
long id = db.insert(UserDataBaseHelper.TABLE_USER_CONFIG, null, cv);
if(id > 0){
return true;
}
LogUtils.d("插入数据库" + id);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 更新数据
public boolean updateUser(TUser user) {
try {
ContentValues cv = new ContentValues();
cv.put("access_token", user.access_token);
String time = System.currentTimeMillis()+"";
cv.put("time", time);
String whereClause = "uid=?";
String[] whereArgs = { user.uid };
int id = db.update(UserDataBaseHelper.TABLE_USER_CONFIG, cv, whereClause,
whereArgs);
if(id > 0){
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 判断数据是否存在
public boolean existUser(TUser user) {
boolean flag = false;
Cursor c = null;
try {
c = db.rawQuery("select * from "
+ UserDataBaseHelper.TABLE_USER_CONFIG + " where uid = ?",
new String[] { user.uid });
flag = c.moveToFirst();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(c != null) {
c.close();
}
}
return flag;
}
// 查询所有数据
public List findAll() {
List list = null;
Cursor c = null;
try {
list = new ArrayList();
c = db.query(UserDataBaseHelper.TABLE_USER_CONFIG, null,
null, null, null, null, "time desc");
if (c.moveToFirst()) {
for (int i = 0; i < c.getCount(); i++) {
TUser model = new TUser();
model.uid = c.getString(c.getColumnIndex("uid"));
model.access_token = c.getString(c
.getColumnIndex("access_token"));
model.time = c.getString(c.getColumnIndex("time"));
list.add(model);
c.moveToNext();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c!= null) {
c.close();
}
}
return list;
}
// 删除数据
public boolean deleteUser(TUser user) {
int flag = 0;
try {
String whereClause = "uid=?";
String[] whereArgs = { user.uid };
flag = db.delete(UserDataBaseHelper.TABLE_USER_CONFIG, whereClause,
whereArgs);
} catch (Exception e) {
e.printStackTrace();
}
if (flag > 0) {
return true;
} else {
return false;
}
}
//删除最新的一条数据
public boolean deleteCurrentUser() {
int flag = 0;
try {
String whereClause = "uid=?";
String[] whereArgs = { currentUser().uid };
flag = db.delete(UserDataBaseHelper.TABLE_USER_CONFIG, whereClause,
whereArgs);
} catch (Exception e) {
e.printStackTrace();
}
if (flag > 0) {
return true;
} else {
return false;
}
}
// uid 条件查询
public TUser findUserByUid(String uid) {
TUser user = null;
Cursor c = null;
try {
c = db.rawQuery("select * from "
+ UserDataBaseHelper.TABLE_USER_CONFIG + "where uid = ?",
new String[] { uid });
if (c.moveToFirst()) {
user = new TUser();
user.uid = c.getString(c.getColumnIndex("uid"));
user.access_token = c.getString(c
.getColumnIndex("access_token"));
user.time = c.getString(c.getColumnIndex("time"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c!= null) {
c.close();
}
}
return user;
}
// 查询最新的一条数据
public TUser currentUser() {
TUser user = new TUser();;
Cursor c = null;
try {
c = db.query(UserDataBaseHelper.TABLE_USER_CONFIG, null,
null, null, null, null, "time desc");
if (c.moveToFirst()) {
user.uid = c.getString(c.getColumnIndex("uid"));
user.access_token = c.getString(c
.getColumnIndex("access_token"));
user.time = c.getString(c.getColumnIndex("time"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(c != null) {
c.close();
}
}
return user;
}
ContentProvider
LoaderManager
- loaders
1.在一个单独线程载入数据;2.监测底层数据源,当探测到有改变时就更新或者重新查询。 - LoaderManager
LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象。每个Activity或者Fragment都有唯一的一个LoaderManager实例,用来启动、停止、保持、重启、关闭它的Loaders。这些事件有时直接在客户端通过调用initLoader()/restartLoader()/destroyLoader()函数来实现。通常这些事件通过主要的Activity/Fragment声明周期事件来触发,而不是手动(当然也可以手动调用)。比如,当一个Activity关闭时(destroyed),改活动将指示它的LoaderManager来销毁并且关闭它的Loaders(当然也会销毁并关闭与这些Loaders关联的资源,比如Cursor)。
LoaderManager并不知道数据如何装载以及何时需要装载。相反地,LoaderManager只需要控制它的Loaders们开始、停止、重置他们的Load行为,在配置变换(比如横竖屏切换)时保持loaders们的状态,并提供一个简单的接口来获取load结果到客户端中。