Flutter SQLite数据库管理插件psqlite的使用
Flutter SQLite数据库管理插件PSQLite的使用
PSQLite简介
PSQLite 是一个用于Dart中轻松操作SQLite数据库的包。以下是该包设计的对象结构:
- TableDb:定义数据库中的表,由多个ColumnDb对象组成,并包含表名。
- ColumnDb:定义数据库表的列,TableDb对象由多个ColumnDb对象构成。
- FieldTypeDb:定义数据库表中列值的类型。SQLite没有单独的布尔存储类,而是用整数0(假)和1(真)来表示布尔值。
- ObjectStored:所有打算存储在SQLite数据库中的对象都应扩展此类。
- PSQLite:封装了一个由TableDb和数据库名组成的数据库。
- FilterDb:定义过滤器以优化SQLite查询。
- ConditionDb:定义过滤条件的类型。
使用示例
创建User类
import 'package:psqlite/psqlite.dart';
class User extends ObjectStored {
final String _id;
String _name;
String _lastName;
int _age;
User(this._id, this._name, this._lastName, this._age);
User.fromJson(this._id, this._name, this._lastName, this._age);
String getId() => _id;
String getName() => _name;
String getLastName() => _lastName;
int getAge() => _age;
void setName(String name) => _name = name;
void setLastName(String lastName) => _lastName = lastName;
void setAge(int age) => _age = age;
@override
String toString() =>
'User{_id: $_id, _name: $_name, _lastName: $_lastName, _age: $_age}';
@override
Map<String, dynamic> toMap() {
return {'id': _id, 'name': _name, 'lastName': _lastName, 'age': _age};
}
@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;
if (_age != other._age) 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;
result = 37 * result + _age.hashCode;
return result;
}
}
创建User Storage Service
import 'package:psqlite/psqlite.dart';
import 'user.dart';
enum UserColumnName { id, name, lastName, age }
class UserStorageService {
static final shared = UserStorageService.init();
late PSQLite _database;
final _tableName = 'users';
UserStorageService.init({bool mockedDatabase = false}) {
List<ColumnDb> columns = [
ColumnDb(
name: UserColumnName.id.name,
type: FieldTypeDb.text,
isPrimaryKey: true),
ColumnDb(name: UserColumnName.name.name, type: FieldTypeDb.text),
ColumnDb(name: UserColumnName.lastName.name, type: FieldTypeDb.text),
ColumnDb(name: UserColumnName.age.name, type: FieldTypeDb.integer)
];
final table = TableDb.create(name: _tableName, columns: columns);
_database = PSQLite(table: table, isMocked: mockedDatabase);
}
PSQLite getDatabase() => _database;
Future<void> addUser(User user) async {
await _database.insertElement(user);
}
Future<void> updateUser(User user) async {
await _database.updateElement(user);
}
Future<bool> 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[UserColumnName.id.name],
response[UserColumnName.name.name],
response[UserColumnName.lastName.name],
response[UserColumnName.age.name]);
}
return null;
}
Future<List<User>> getListOfUsers({List<FilterDb> where = const []}) async {
final maps = await _database.getElements(where: where);
return List.generate(maps.length, (i) {
return User(
maps[i][UserColumnName.id.name],
maps[i][UserColumnName.name.name],
maps[i][UserColumnName.lastName.name],
maps[i][UserColumnName.age.name]);
});
}
Future<void> removeUsers(List<FilterDb> filters) async {
await _database.deleteElements(where: filters);
}
Future<void> removeAll() async {
await _database.clearTable();
}
}
使用实例
创建User Storage Service
你可以创建单个对象:
final storageService = UserStorageService.init();
或者使用单例模式获取共享实例:
final storageService = UserStorageService.shared;
添加新用户到SQLite
final storageService = UserStorageService.init();
final user = User("1", "Liam", "Neeson", 18);
await storageService.addUser(user);
更新SQLite中存储的用户
final storageService = UserStorageService.init();
// 添加新用户部分
User user = User("1", "Liam", "Neeson", 18);
await storageService.addUser(user);
// 更新用户部分
user.setLastName(finalLastName);
await storageService.updateUser(user);
获取SQLite中存储的用户列表
final storageService = UserStorageService.init();
await storageService.getListOfUsers();
获取过滤后的用户列表
final storageService = UserStorageService.init();
List<FilterDb> filters = [
FilterDb(UserColumnName.lastName.name, "Neeson", ConditionDb.equal),
FilterDb(UserColumnName.age.name, 18, ConditionDb.greaterOrEqual)
];
final filteredUsers = await storageService.getListOfUsers(where: filters);
删除SQLite中存储的用户
final storageService = UserStorageService.init();
final user = User("1", "Liam", "Neeson", 18);
await storageService.removeUser(user);
删除SQLite中所有的用户
你可以通过调用removeAll
方法或不带过滤参数调用removeUsers
方法来删除所有用户。
final storageService = UserStorageService.init();
await storageService.removeAll();
或
final storageService = UserStorageService.init();
await storageService.removeUsers();
以上是关于如何在Flutter项目中使用PSQLite进行SQLite数据库管理的基本介绍和示例代码。希望这些信息能帮助你更好地理解和使用这个插件。
更多关于Flutter SQLite数据库管理插件psqlite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter SQLite数据库管理插件psqlite的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,psqlite
是一个用于管理 SQLite 数据库的插件。虽然 psqlite
并不是官方推荐或者广泛使用的插件(通常人们更倾向于使用 sqflite
),但我们可以展示如何使用类似的 SQLite 管理插件来进行基本的数据库操作。由于 psqlite
的具体实现和文档可能较为有限,这里我会提供一个使用 sqflite
的示例,因为 sqflite
是 Flutter 社区中广泛接受和使用的 SQLite 数据库管理插件。
首先,确保在 pubspec.yaml
文件中添加 sqflite
依赖:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.2 # 请检查最新版本号
然后,运行 flutter pub get
来获取依赖。
以下是一个使用 sqflite
进行数据库管理的示例代码,包括创建数据库、创建表、插入数据、查询数据和关闭数据库的基本操作:
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SQLite Demo'),
),
body: DatabaseDemo(),
),
);
}
}
class DatabaseDemo extends StatefulWidget {
@override
_DatabaseDemoState createState() => _DatabaseDemoState();
}
class _DatabaseDemoState extends State<DatabaseDemo> {
Database? _db;
@override
void initState() {
super.initState();
_initDatabase();
}
Future<void> _initDatabase() async {
// 获取应用文档目录
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, 'demo.db');
// 打开数据库
_db = await openDatabase(path, version: 1, onCreate: _onCreate);
}
Future<void> _onCreate(Database db, int version) async {
// 创建表
await db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''');
}
Future<void> _insertData() async {
if (_db != null) {
await _db!.insert(
'users',
{'name': 'Alice', 'age': 30},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
}
Future<List<Map<String, dynamic>>> _queryData() async {
if (_db != null) {
return await _db!.query('users');
} else {
return [];
}
}
Future<void> _closeDatabase() async {
if (_db != null) {
await _db!.close();
}
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
await _insertData();
print('Data inserted');
},
child: Text('Insert Data'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
List<Map<String, dynamic>> users = await _queryData();
print('Users: $users');
},
child: Text('Query Data'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
await _closeDatabase();
print('Database closed');
},
child: Text('Close Database'),
),
],
),
);
}
@override
void dispose() {
_closeDatabase();
super.dispose();
}
}
在这个示例中,我们展示了如何:
- 在
initState
方法中初始化数据库。 - 在
_onCreate
方法中创建表。 - 使用
_insertData
方法插入数据。 - 使用
_queryData
方法查询数据。 - 使用
_closeDatabase
方法关闭数据库。
请注意,sqflite
是处理 SQLite 数据库的一个流行且功能强大的插件,而 psqlite
可能具有不同的 API 和实现细节。如果你确实需要使用 psqlite
,建议查阅其官方文档或仓库以获取具体的用法和示例。如果 psqlite
的 API 与 sqflite
类似,上述代码结构可以作为参考,并根据 psqlite
的文档进行相应调整。