通网这么多年了,真是不知道在终端设备留个本地数据库的应用场景还有没有存在的价值,但是居然在本周遇到了一个。很神奇,遂简单学习了一下基本用法,记录下来以资来者。
SQLiteOpenHelper
Android提供了一个很好用的封装类供大家进行sqlite数据库操作。所以Android操作Sqlite数据库的第一步就是创建一个DBHelper
继承SQLiteOpenHelper
。然后实现其中两个抽象方法onCreate
与onUpgrade
。最后通过DBHelper#getWritableDatabase
来对数据库进行增删改查操作。
public class DBHelper extends SQLiteOpenHelper {
private Context mContext;
public DBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory,
int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
建表
为了减少学习成本,DBHelper#getWritableDatabase
很贴心的为大家提供了最纯粹的sql执行方式。execSQL
使用这个方法就是直接怼着建好的库进行一系列数据库操作了。我们就来用这个方法建表。建表语句建议写在onCreate
里。另外考虑到重复建表的问题,考虑加上if not exists
。
private static final String create_user_table = "create table if not exists user_table (user_id integer primary key, user_name text, update_time integer)";
SQLite的数据类型很简单,如下表。
类型 | SQLite | Java |
整型 | INTEGER | byte, short, int, long |
浮点型 | REAL | float, double |
字符串 | TEXT | String |
布尔串 | BLOB | boolean |
增加
除了使用execSQL
来直接运行sql命令外,还可以使用Android封装的insert
方法来进行数据插入。
public void insertUser(User user) {
ContentValues values = new ContentValues();
values.put("user_id", user.userId);
values.put("user_name", user.userName);
mDB.insert("user_table", null, values);
}
删除
使用Android封装的delete
方法来进行数据删除。第一个入参是表名,第二个是删除条件,用?
来占位,第三入参是第二个参数的数据填充。
public void deleteUserByUserId(int userId) {
mDB.delete("user_table", "user_id=?", new String[]{String.valueOf(userId)});
}
更新
使用Android封装的update
方法来进行数据更新。第一个入参是表名,第二个是更新键值对,第三四个入参与删除的2、3入参一样就是更新条件。
public void updateUserByUserId(int userId, int newName, long updateTime) {
ContentValues values = new ContentValues();
values.put("user_name", newScore);
values.put("update_time", updateTime);
mDB.update("user_table", values, "user_id=?", new String[]{String.valueOf(userId)});
}
查询
使用Android封装的query
方法来进行数据查询。第一个入参是表名,第二个是查询列明,第三四个入参与删除的2、3入参一样就是查询条件,第五、第六、第七分别为聚和条件、虚表条件(写后台时也没用过)以及排序条件。
public List<User> searchAllUser() {
List<User> list = new ArrayList<>();
Cursor cursor = mDB.query("user_table", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
int userId = cursor.getInt(cursor.getColumnIndex("user_id"));
String userName = cursor.getString(cursor.getColumnIndex("user_name"));
long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
User res = new User(userId, userName, updateTime);
list.add(res);
} while (cursor.moveToNext());
}
cursor.close();
return list;
}
TODO
数据库的操作可以很复杂,最重要的还得再看看事务回滚,这波需求已经让我明确感觉到多表更新时,如果出现问题将会是多大的灾难。