Flutter数据库管理插件sqlite_flutter_pcl的使用
Flutter数据库管理插件sqlite_flutter_pcl的使用
SQLiteConnection 提供了在 Dart 中与 SQLite 数据库交互的简化接口,支持各种操作如搜索、插入、更新、删除等。
特性
- 搜索操作:不区分大小写、特定列、多列搜索。
- 插入操作:单条和批量插入。
- 更新操作:单条和批量更新,并处理冲突。
- 删除操作:单条和批量删除。
- 高级查询:分组、分页和随机行检索。
- 数据库管理:表创建、删除和备份。
开始使用
在 pubspec.yaml
文件中添加该包:
dependencies:
sqlite_flutter_pcl: ^1.0.0
基本用法
初始化
首先,创建一个实现 ISQLiteItem
接口的类来表示数据库表。
import 'package:sqlite_flutter_pcl/sqlite_connection.dart';
class SqlModel implements ISQLiteItem {
static const String tableName = 'sql_model';
static const String tableId = 'id';
static const String tableTitle = 'title';
static const String tableValue = 'value';
int? id;
String? title;
String? value;
SqlModel({this.id, this.title, this.value});
@override
String getTableName() {
return tableName;
}
@override
int getPrimaryKey() {
return id ?? 0;
}
@override
Map<String, dynamic> toMap() {
return {
tableId: id,
tableTitle: title,
tableValue: value,
};
}
@override
String getPrimaryKeyName() {
return tableId;
}
@override
ISQLiteItem fromMap(Map<String, dynamic> map) {
return SqlModel(
id: map[tableId],
title: map[tableTitle],
value: map[tableValue],
);
}
}
创建 SQLiteConnection 实例:
// 初始化 SQLiteConnection 库(如果未初始化)
SQLiteConnection.initDatabaseLib();
// 获取临时数据库文件路径
final databasePath = await getTemporaryDatabaseFilePath();
// 创建 SQLiteConnection 实例
final connection = SQLiteConnection(path: databasePath);
// 创建表
connection.createTable(SqlModel());
// 插入新项
var newItem = SqlModel(title: 'Title 1', value: 'Value 1');
await connection.insert(newItem);
// 检索项
var isqliteItems = await connection.toList(SqlModel());
// 转换为类型列表
var items = isqliteItems.whereType<SqlModel>().toList();
var items = isqliteItems.cast<SqlModel>().toList();
// 更新项
for (var item in items) {
item.value = 'Updated';
await connection.update(item);
}
// 或者批量更新
await connection.updateAll(items);
// 删除项
await connection.deleteAll(items);
// 查询单个值
var queryItems = await connection.toListWhere(SqlModel(), 'title', 'Title 1');
// 按值查询项
var queryItems = await connection.searchColumns(SqlModel(), 'title', 'Title 1');
// 返回标题为 'title1' 和 'title2' 的项,使用批处理查询提高效率
var results = await connection.toListWhereValuesAre(SqlModel(), 'title', ['title1', 'title2']);
// 跨多个列搜索
var columnNames = ['word', 'number', 'lemma', 'xlit', 'pronounce', 'description'];
var items = await db.toListColumns(Strongs(), columnNames, query);
// 删除所有表记录
connection.deleteRecords(SqlModel());
// 删除表
connection.dropTable(SqlModel());
Future<String> getTemporaryDatabaseFilePath() async {
final directory = await getTemporaryDirectory();
final path = join(directory.path, 'your_database.db');
print(path);
return path;
}
插入数据
单条数据
final id = await connection.insert(sqlItem);
多条数据
final totalInserted = await connection.insertAll(sqlItems);
更新数据
单条数据
await connection.update(sqlItem);
多条数据
final totalUpdated = await connection.updateAll(sqlItems);
删除数据
单条数据
final rowsDeleted = await connection.delete(sqlItem);
多条数据
final totalDeleted = await connection.deleteAll(sqlItems);
搜索数据
单列搜索
final results = await connection.search(sqlItem, 'columnName', 'searchQuery');
多列搜索
final results = await connection.searchColumns(
sqlItem,
['column1', 'column2'],
'searchQuery',
);
精确匹配
final result = await connection.whereColumnHasValue(sqlItem, 'columnName', value);
查询数据
获取所有行
final items = await connection.toList(sqlItem);
过滤行
final items = await connection.toListWhereColumnHasValue(sqlItem, 'columnName', value);
分页行
final items = await connection.paginate(sqlItem, limit: 10, offset: 20);
分组行
final items = await connection.groupBy(
sqlItem,
['column1', 'column2'],
'groupByColumn',
orderByColumn: 'orderByColumn',
);
工具函数
- 备份数据库
await connection.backupDatabase('/path/to/backup.db');
- 删除表
await connection.dropTable(sqlItem);
- 清理数据库
await connection.vacuum(sqlItem);
- 统计行数
final count = await connection.count(sqlItem);
- 获取表列
final columns = await connection.tableColumns('tableName');
更多关于Flutter数据库管理插件sqlite_flutter_pcl的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库管理插件sqlite_flutter_pcl的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用 sqlite_flutter_pcl
插件进行 Flutter 数据库管理的代码示例。这个插件允许你在 Flutter 应用中直接与 SQLite 数据库进行交互。
首先,确保你已经在 pubspec.yaml
文件中添加了 sqlite_flutter_pcl
依赖:
dependencies:
flutter:
sdk: flutter
sqlite_flutter_pcl: ^x.y.z # 请替换为最新版本号
然后运行 flutter pub get
以获取依赖。
接下来,你可以创建一个 Flutter 应用并使用 sqlite_flutter_pcl
插件进行数据库操作。以下是一个简单的示例,展示了如何打开数据库、创建表、插入数据、查询数据以及关闭数据库。
import 'package:flutter/material.dart';
import 'package:sqlite_flutter_pcl/sqlite_flutter_pcl.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SQLite Flutter PCL Example'),
),
body: DatabaseExample(),
),
);
}
}
class DatabaseExample extends StatefulWidget {
@override
_DatabaseExampleState createState() => _DatabaseExampleState();
}
class _DatabaseExampleState extends State<DatabaseExample> {
Database? _db;
@override
void initState() {
super.initState();
_initDatabase();
}
Future<void> _initDatabase() async {
// 打开数据库连接
_db = await openDatabase(
join(await getDatabasesPath(), 'example.db'),
onCreate: (Database db, int version) async {
// 创建表
await db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''');
},
version: 1,
);
// 插入数据
await _db!.insert(
'users',
{'name': 'Alice', 'age': 30},
conflictAlgorithm: ConflictAlgorithm.replace,
);
await _db!.insert(
'users',
{'name': 'Bob', 'age': 25},
conflictAlgorithm: ConflictAlgorithm.replace,
);
// 查询数据并更新UI
setState(() {}); // 这里只是示例,实际上查询数据后应该更新UI组件
}
Future<List<Map<String, dynamic>>> _queryUsers() async {
return await _db!.query('users');
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Map<String, dynamic>>>(
future: _queryUsers(),
builder: (BuildContext context, AsyncSnapshot<List<Map<String, dynamic>>> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (BuildContext context, int index) {
Map<String, dynamic> user = snapshot.data![index];
return ListTile(
title: Text('${user['name']} (${user['age']})'),
);
},
);
} else {
return Center(child: CircularProgressIndicator());
}
},
);
}
@override
void dispose() {
// 关闭数据库连接
_db?.close();
super.dispose();
}
}
在这个示例中:
openDatabase
用于打开或创建一个 SQLite 数据库。onCreate
回调用于在数据库版本为 1 时创建表。insert
方法用于插入数据到表中。query
方法用于查询数据。FutureBuilder
用于在 UI 中异步显示查询结果。- 在
dispose
方法中关闭数据库连接。
请注意,这个示例只是展示了基本的数据库操作。在实际应用中,你可能需要更复杂的错误处理和更细致的 UI 更新逻辑。