Flutter 数据库使用示例
2021-05-27 本文已影响0人
李小轰
时光易老,每天晨跑。今天我们来简单说说Flutter的数据库使用。
- 首先,我们进行一个简单的封装,创建抽象基类 BaseDbProvider 提供给每个业务层作为模板:
abstract class BaseDbProvider {
//提供上层业务方实现
String getDbFileName();
Future<Database> getDb(Database db, int dbVersion) async {
if (db == null || !db.isOpen) {
String dbPath = await getDatabasesPath();
File file = File(join(dbPath, getDbFileName()));
bool exists = await file.exists();
if (!exists) {
await file.create(recursive: true);
}
db = await openDatabase(join(dbPath, getDbFileName()),
version: dbVersion, onCreate: onCreate, onUpgrade: onUpgrade);
}
return db;
}
Future onCreate(Database db, int version);
//版本更新时会使用
Future onUpgrade(Database db, int oldVersion, int newVersion);
}
- 接下来,假设我们需要封装一个用户相关的数据层,我们来这么使用:
class UserDbProvider extends BaseDbProvider {
static UserDbProvider _instance;
Database _db;
factory UserDbProvider() {
if (_instance == null) {
_instance = UserDbProvider._();
}
return _instance;
}
static UserDbProvider get instance => UserDbProvider();
UserDbProvider._();
Future<bool> _openDb() async {
_db = await getDb(_db, 1);
return Future.value(true);
}
@override
String getDbFileName() {
return 'user.db';
}
@override
Future onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE IF NOT EXISTS 'user' (
ID TEXT,
Level TEXT,
Name TEXT)
''');
}
@override
Future onUpgrade(Database db, int oldVersion, int newVersion) async {
await db.execute("DROP TABLE 'user'");
await onCreate(db, newVersion);
}
Future updateUsers(List<User> bucket) async {
await _openDb();
Batch batch = _db.batch();
bucket.forEach((element) {
batch.update("'user'", element.toJson(),
where: "Level = ?",
whereArgs: ["${element.level}"],
conflictAlgorithm: ConflictAlgorithm.replace);
});
return batch.commit();
}
}
以上两个步骤,便是一个简单的数据库层使用示例。
附注,
对于sql的使用,我们也可以灵活的自己进行拼接,需要注意的是,拼接sql时,表名,以及字段对应的条件value,需要使用单引号:
await _openDb();
String sql ="SELECT * FROM 'user' WHERE ID = '1'";
List list = await _db.rawQuery(sql);