通网这么多年了,真是不知道在终端设备留个本地数据库的应用场景还有没有存在的价值,但是居然在本周遇到了一个。很神奇,遂简单学习了一下基本用法,记录下来以资来者。

SQLiteOpenHelper

Android提供了一个很好用的封装类供大家进行sqlite数据库操作。所以Android操作Sqlite数据库的第一步就是创建一个DBHelper继承SQLiteOpenHelper。然后实现其中两个抽象方法onCreateonUpgrade。最后通过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

数据库的操作可以很复杂,最重要的还得再看看事务回滚,这波需求已经让我明确感觉到多表更新时,如果出现问题将会是多大的灾难。