Flutter本地数据库管理插件sqlitec的使用
Flutter本地数据库管理插件sqlitec的使用
简介
A Dart插件用于生成本地数据库的样板代码,具有低耦合性和类型安全性,完全受到Go语言库sqlc的启发。
这不是一个ORM。 这个包并没有意图成为一个ORM。相反,它只是为你处理数据库的繁琐部分,让你保持控制并完全了解发生了什么。没有魔法代码,没有意外,只有简单且惯用的Dart代码。
此插件可以在任何操作系统上工作,并且可以与sqflite和sqflite_common_ffi一起使用。
特性
使用此插件在您的Dart应用程序中实现以下功能:
- 从表中创建类。
- 调用查询作为简单的Dart方法以确保类型安全。
- 在不担心类型转换和所有样板代码的情况下从数据库中消费数据。
开始使用
要使用此插件,您需要安装sqflite或sqflite_common_ffi实现。
使用方法
在项目的lib文件夹中创建一个.sql文件,并编写自定义SQL命令。
示例SQL文件 (example.sql)
create table customers (
id integer primary key autoincrement,
name varchar not null default null,
status varchar not null default ''
);
--name getCustomerByName :one
select * from customers where name = ? and status = :status;
--name: insertCustomer :exec
insert into customers(name, status) values (?, ?);
自动生成代码
运行插件后,会生成对应的Dart代码。以下是生成的代码示例:
生成的代码 (sqlitec/schemas.dart)
class Customers {
static const String $tableInfo = 'customers';
static const String $createTableStatement = 'CREATE TABLE customers(id integer PRIMARY KEY AUTOINCREMENT, name varchar NOT NULL DEFAULT NULL, status varchar NOT NULL DEFAULT \'\')';
int id;
String name;
String status;
Customers({
required this.id,
required this.name,
required this.status,
});
factory Customers.fromJson(Map<String, dynamic> jsonMap) {
return Customers(
id: (jsonMap['id'] as num).toInt(),
name: jsonMap['name'] as String,
status: jsonMap['status'] as String,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'status': status,
};
}
@override
String toString() {
return '''Customers(
id: $id,
name: $name,
status: $status,
)''';
}
}
// 方法生成在Queries类中 (`sqlitec/queries.sqlitec.dart`)
Future<Customers?> getCustomerByNameAndStatus(String $arg1, {required String status}) async {
final result = await db.rawQuery(
'SELECT * FROM customers WHERE name = ? AND status = ?',
[$arg1, status],
);
if (result.isEmpty) return null;
final resultFirst = result.first;
return Customers.fromJson(resultFirst);
}
Future<int> insertCustomer({required String name, required String status}) async {
final result = await db.rawInsert(
'INSERT INTO customers (name, status) VALUES (?, ?)',
[name, status],
);
return result;
}
使用生成的代码
final queries = Queries(db: /*您的数据库实例*/);
await queries.insertCustomer(name: 'Bob', status: 'registered');
final user = await queries.getCustomerByNameAndStatus('Bob', status: 'registered');
print(user);
// 输出: Customers(id: 1, name: Bob, status: registered)
示例代码
以下是完整的示例代码,展示如何初始化数据库并使用生成的代码:
示例代码 (example/lib/example.dart)
import 'dart:convert';
import 'package:example/sqlitec/queries.sqlitec.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'sqlitec/schemas.sqlitec.dart';
Future<void> main(List<String> arguments) async {
// 初始化sqflite ffi
sqfliteFfiInit();
// 打开内存数据库
final db = await databaseFactoryFfi.openDatabase(
inMemoryDatabasePath,
options: OpenDatabaseOptions(
onConfigure: (db) async {
// 创建表
await db.execute(Orders.$createTableStatement);
await db.execute(Customers.$createTableStatement);
await db.execute(Payments.$createTableStatement);
},
),
);
// 初始化Queries实例
final queries = Queries(db: db);
// 插入数据
var id = await queries.insertCustumer(name: 'Kauli', status: 'registered');
print(id);
// 更新数据
await db.update('customers', {'updated_at': 'asdfasdfasdf'});
// 查询数据
final asdf = await db.query('customers', where: 'name = ?', whereArgs: ['Kauli']);
print(jsonEncode(asdf));
// 关闭数据库
await db.close();
}
更多关于Flutter本地数据库管理插件sqlitec的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地数据库管理插件sqlitec的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,sqflite 是一个常用的插件,用于管理和操作SQLite数据库。以下是如何使用 sqflite 插件进行本地数据库管理的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml 文件中添加 sqflite 和 path 依赖:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+4
path: ^1.8.0
然后运行 flutter pub get 来安装依赖。
2. 创建数据库
创建一个类来管理数据库操作。你可以在这个类中定义数据库的创建、表的创建、以及各种CRUD操作。
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper._internal();
factory DatabaseHelper() => _instance;
static Database? _database;
DatabaseHelper._internal();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'my_database.db');
return 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,
age INTEGER
)
''');
}
}
3. 插入数据
定义插入数据的方法:
Future<void> insertUser(Map<String, dynamic> user) async {
final db = await DatabaseHelper().database;
await db.insert('users', user, conflictAlgorithm: ConflictAlgorithm.replace);
}
4. 查询数据
定义查询数据的方法:
Future<List<Map<String, dynamic>>> getUsers() async {
final db = await DatabaseHelper().database;
return await db.query('users');
}
5. 更新数据
定义更新数据的方法:
Future<void> updateUser(Map<String, dynamic> user) async {
final db = await DatabaseHelper().database;
await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [user['id']],
);
}
6. 删除数据
定义删除数据的方法:
Future<void> deleteUser(int id) async {
final db = await DatabaseHelper().database;
await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
7. 使用数据库操作
在你的应用程序中,你可以使用这些方法来管理数据库。例如:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 插入数据
await insertUser({'name': 'John Doe', 'age': 30});
// 查询数据
List<Map<String, dynamic>> users = await getUsers();
print(users);
// 更新数据
await updateUser({'id': 1, 'name': 'John Doe', 'age': 31});
// 删除数据
await deleteUser(1);
runApp(MyApp());
}
8. 关闭数据库
在应用程序结束时,关闭数据库:
Future<void> closeDatabase() async {
final db = await DatabaseHelper().database;
await db.close();
}

