Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用
Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用
sqflite
适配器用于 jaguar_query
和 jaguar_orm
。
使用方法
以下是一个简单的使用示例:
import 'dart:io';
import 'dart:async';
import 'package:sqflite/sqflite.dart';
import 'package:jaguar_query_sqflite_nullsafety/jaguar_query_sqflite_nullsafety.dart';
// 定义模型
class Post {
Post();
Post.make(this.id, this.msg, this.author);
int id;
String msg;
String author;
[@override](/user/override)
String toString() => '$id $msg $author';
}
/// 适配器
SqfliteAdapter _adapter;
/// 数据库操作类
class PostBean {
/// 字段定义
final IntField id = new IntField('_id');
/// 字段定义
final StrField msg = new StrField('msg');
/// 字段定义
final StrField author = new StrField('author');
/// 表名
String get tableName => 'posts';
/// 创建表
Future<void> createTable() async {
final st = new Create(tableName, ifNotExists: true)
.addInt('_id', primary: true)
.addStr('msg', isNullable: true)
.addStr('author', isNullable: true);
await _adapter.createTable(st);
}
/// 插入新记录
Future<int> insert(Post post) async {
Insert inserter = new Insert(tableName);
inserter.set(id, post.id);
inserter.set(msg, post.msg);
inserter.set(author, post.author);
return await _adapter.insert(inserter);
}
/// 更新记录
Future<int> update(int id, String author) async {
Update updater = new Update(tableName);
updater.where(this.id.eq(id));
updater.set(this.author, author);
return await _adapter.update(updater);
}
/// 查找一条记录
Future<Post> findOne(int id) async {
Find updater = new Find(tableName);
updater.where(this.id.eq(id));
Map<String, dynamic> map = await _adapter.findOne(updater);
Post post = new Post();
post.id = map['_id'];
post.msg = map['msg'];
post.author = map['author'];
return post;
}
/// 查找所有记录
Future<List<Post>> findAll() async {
Find finder = new Find(tableName);
List<Map<String, dynamic>> maps = await (await _adapter.find(finder)).toList();
List<Post> posts = new List<Post>();
for (Map<String, dynamic> map in maps) {
Post post = new Post();
post.id = map['_id'];
post.msg = map['msg'];
post.author = map['author'];
posts.add(post);
}
return posts;
}
/// 删除一条记录
Future<int> remove(int id) async {
Remove deleter = new Remove(tableName);
deleter.where(this.id.eq(id));
return await _adapter.remove(deleter);
}
/// 删除所有记录
Future<int> removeAll() async {
Remove deleter = new Remove(tableName);
return await _adapter.remove(deleter);
}
}
void main() async {
_adapter = new SqfliteAdapter(await getDatabasesPath());
// 连接数据库
await _adapter.connect();
final bean = new PostBean();
await bean.createTable();
// 删除所有记录
await bean.removeAll();
// 插入一些记录
await bean.insert(new Post.make(1, 'Whatever 1', 'mark'));
await bean.insert(new Post.make(2, 'Whatever 2', 'bob'));
// 查找一条记录
Post post = await bean.findOne(1);
print(post);
// 查找所有记录
List<Post> posts = await bean.findAll();
print(posts);
// 更新一条记录
await bean.update(1, 'rowling');
// 检查更新是否成功
post = await bean.findOne(1);
print(post);
// 删除一些记录
await bean.remove(1);
await bean.remove(2);
// 尝试查找不存在的记录
try {
post = await bean.findOne(1);
print(post);
} on JaguarOrmException catch (e) {
print(e);
}
// 关闭连接
await _adapter.close();
exit(0);
}
更多关于Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
jaguar_query_sqflite_nullsafety
是一个用于在 Flutter 中进行数据库操作的插件,它结合了 jaguar_query
和 sqflite
,并支持空安全(null safety)。这个插件可以帮助你在 Flutter 应用中更方便地进行数据库查询和操作。
安装插件
首先,你需要在 pubspec.yaml
文件中添加依赖:
dependencies:
flutter:
sdk: flutter
jaguar_query_sqflite_nullsafety: ^1.0.0
然后运行 flutter pub get
来安装依赖。
数据库初始化
在使用 jaguar_query_sqflite_nullsafety
之前,你需要初始化数据库。通常,你可以在应用的启动阶段进行初始化。
import 'package:jaguar_query_sqflite_nullsafety/jaguar_query_sqflite_nullsafety.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化数据库
var adapter = SqfliteAdapter('my_database.db');
await adapter.connect();
// 创建表
await adapter.createTable(Person.table, ifNotExists: true);
runApp(MyApp(adapter));
}
定义模型
你需要定义一个模型类来表示数据库中的表。可以使用 jaguar_query
的注解来定义表的字段和关系。
import 'package:jaguar_query_sqflite_nullsafety/jaguar_query_sqflite_nullsafety.dart';
class Person {
[@PrimaryKey](/user/PrimaryKey)(auto: true)
int? id;
[@Column](/user/Column)(length: 50)
String? name;
[@Column](/user/Column)()
int? age;
static String get table => 'person';
}
插入数据
你可以使用 SqfliteAdapter
来插入数据到数据库中。
Future<void> insertPerson(SqfliteAdapter adapter) async {
var person = Person()
..name = 'John Doe'
..age = 30;
await adapter.insert(Person.table, person);
}
查询数据
你可以使用 SqfliteAdapter
来查询数据库中的数据。
Future<List<Person>> getPeople(SqfliteAdapter adapter) async {
var finder = Selector(adapter)
..from(Person.table);
var result = await finder.getMapList();
return result.map((map) => Person()
..id = map['id']
..name = map['name']
..age = map['age']).toList();
}
更新数据
你可以使用 SqfliteAdapter
来更新数据库中的数据。
Future<void> updatePerson(SqfliteAdapter adapter, Person person) async {
var updater = Updater(adapter)
..table(Person.table)
..where(eq('id', person.id))
..set('name', person.name)
..set('age', person.age);
await updater.update();
}
删除数据
你可以使用 SqfliteAdapter
来删除数据库中的数据。
Future<void> deletePerson(SqfliteAdapter adapter, int id) async {
var deleter = Deleter(adapter)
..from(Person.table)
..where(eq('id', id));
await deleter.delete();
}
关闭数据库连接
在应用关闭时,最好关闭数据库连接以释放资源。
Future<void> closeDatabase(SqfliteAdapter adapter) async {
await adapter.close();
}
完整示例
以下是一个完整的示例,展示了如何使用 jaguar_query_sqflite_nullsafety
进行数据库操作。
import 'package:flutter/material.dart';
import 'package:jaguar_query_sqflite_nullsafety/jaguar_query_sqflite_nullsafety.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
var adapter = SqfliteAdapter('my_database.db');
await adapter.connect();
await adapter.createTable(Person.table, ifNotExists: true);
runApp(MyApp(adapter));
}
class MyApp extends StatelessWidget {
final SqfliteAdapter adapter;
MyApp(this.adapter);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter Database Example')),
body: Center(
child: FutureBuilder<List<Person>>(
future: getPeople(adapter),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (snapshot.data!.isEmpty) {
return Text('No data found');
} else {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
var person = snapshot.data![index];
return ListTile(
title: Text(person.name ?? 'No name'),
subtitle: Text('Age: ${person.age}'),
);
},
);
}
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
var person = Person()
..name = 'Jane Doe'
..age = 25;
await insertPerson(adapter, person);
},
child: Icon(Icons.add),
),
),
);
}
}
class Person {
[@PrimaryKey](/user/PrimaryKey)(auto: true)
int? id;
[@Column](/user/Column)(length: 50)
String? name;
[@Column](/user/Column)()
int? age;
static String get table => 'person';
}
Future<void> insertPerson(SqfliteAdapter adapter) async {
var person = Person()
..name = 'John Doe'
..age = 30;
await adapter.insert(Person.table, person);
}
Future<List<Person>> getPeople(SqfliteAdapter adapter) async {
var finder = Selector(adapter)
..from(Person.table);
var result = await finder.getMapList();
return result.map((map) => Person()
..id = map['id']
..name = map['name']
..age = map['age']).toList();
}
Future<void> updatePerson(SqfliteAdapter adapter, Person person) async {
var updater = Updater(adapter)
..table(Person.table)
..where(eq('id', person.id))
..set('name', person.name)
..set('age', person.age);
await updater.update();
}
Future<void> deletePerson(SqfliteAdapter adapter, int id) async {
var deleter = Deleter(adapter)
..from(Person.table)
..where(eq('id', id));
await deleter.delete();
}
Future<void> closeDatabase(SqfliteAdapter adapter) async {
await adapter.close();
}