PSQlite
使用此包在 Dart 中轻松操作 sqlite 数据库。设计的对象结构如下:
- TableDb:定义数据库中的一个表。它由 ColumnDb 对象集合和一个表名组成。
- ColumnDb:定义数据库表的一列。TableDb 对象将由 ColumnDb 对象集合组成。
- FieldTypeDb:定义数据库表中列的值的类型。SQLite 没有单独的 Boolean 存储类。相反,布尔值存储为整数 0(false)和 1(true)。
- ObjectStored:所有打算存储在 SQLite 数据库中的对象都应扩展 ObjectStored 类。
- PSQLite:封装一个由 TableDb 和数据库名组成的数据库。
使用示例
在下面的示例中,您将看到如何创建一个用户数据库。
导入 psqlite.dart
import 'package:psqlite/psqlite.dart';
创建用户
User 类代表我们要存储的对象。任何要移植到 SQLite 的对象都需要扩展 ObjectStored 类。这将迫使我们重写 toMap 和 getPrimaryKey 方法。
import 'package:psqlite/psqlite.dart';
class User extends ObjectStored {
final String _id;
String _name;
String _lastName;
User(this._id, this._name, this._lastName);
User.fromJson(this._id, this._name, this._lastName);
String getId() => _id;
String getName() => _name;
String getLastName() => _lastName;
void setName(String name) => _name = name;
void setLastName(String lastName) => _lastName = lastName;
@override
String toString() => 'User{_id: $_id, name: $_name, _lastName: $_lastName}';
// The keys must correspond to the names of the columns in the database.
@override
Map<String, dynamic> toMap() {
return {
'id': _id,
'name': _name,
'lastName': _lastName,
};
}
@override
String getPrimaryKey() => _id;
@override
bool operator ==(Object other) {
if (other is! User) return false;
if (_id != other._id) return false;
if (_name != other._name) return false;
if (_lastName != other._lastName) return false;
return true;
}
@override
int get hashCode {
var result = 17;
result = 37 * result + _id.hashCode;
result = 37 * result + _name.hashCode;
result = 37 * result + _lastName.hashCode;
return result;
}
}
创建用户存储服务
封装我们创建的用户对象的持久化数据的最简单方法是创建一个包装器服务。在其中,我们将创建表列和数据库名称。mockedDatabase 参数将允许我们对服务进行单元测试。
import 'package:psqlite/psqlite.dart';
import 'user.dart';
class UserStorageService {
static final shared = UserStorageService.init();
late PSQLite _database;
UserStorageService.init({bool mockedDatabase = false}) {
List<ColumnDb> columns = [
ColumnDb(
fieldName: 'id', fieldType: FieldTypeDb.text, isPrimaryKey: true),
ColumnDb(fieldName: 'name', fieldType: FieldTypeDb.text),
ColumnDb(fieldName: 'lastName', fieldType: FieldTypeDb.text)
];
final table = TableDb.create(name: 'users', columns: columns);
_database = PSQLite(table: table, isMocked: mockedDatabase);
}
Future<void> addUser(User user) async {
return await _database.insertElement(user);
}
Future<void> updateUser(User user) async {
return await _database.updateElement(user);
}
Future<void> removeUser(User user) async {
return await _database.deleteElement(user);
}
Future<User?> getUser(String id) async {
final response = await _database.getElementBy(id);
if (response != null) {
return User(response['id'], response['name'], response['lastName']);
}
return null;
}
Future<List<User>> getListOfUsers() async {
final maps = await _database.getElements();
return List.generate(maps.length, (i) {
return User(maps[i]['id'], maps[i]['name'], maps[i]['lastName']);
});
}
Future<void> removeAll() async {
await _database.clearTable();
}
}
用法
现在我们可以从应用程序的任何地方向我们的用户存储服务发出请求。
创建用户存储服务
您可以创建一个单一对象
final storageService = UserStorageService.init();
或者您可以使用单例模式获取共享实例
final storageService = UserStorageService.shared;
将新用户添加到 SQLite
您可以使用我们的用户存储服务添加一个新用户
final storageService = UserStorageService.init();
final user = User("1", "Liam", "Neeson");
await storageService.addUser(user);
更新 SQLite 中的已存储用户
您可以更新已存储的用户,在此示例中,我们首先添加一个新用户,然后对其进行更新
final storageService = UserStorageService.init();
// User add part
User user = User("1", "Liam", "Neeson");
await storageService.addUser(user);
// Update user part
user.setLastName(finalLastName);
await storageService.updateUser(user);
获取 SQLite 中存储的用户列表
您可以获取存储的所有用户列表
final storageService = UserStorageService.init();
await storageService.getListOfUsers();
从 SQLite 中移除已存储的用户
您可以通过将用户实例作为参数来删除用户
final storageService = UserStorageService.init();
final user = User("1", "Liam", "Neeson");
await storageService.removeUser(user);
从 SQLite 中移除所有已存储的用户
您可以删除所有用户
final storageService = UserStorageService.init();
await storageService.removeAll();