Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用

Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用

sqflite 适配器用于 jaguar_queryjaguar_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

1 回复

更多关于Flutter数据库查询与空安全插件jaguar_query_sqflite_nullsafety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


jaguar_query_sqflite_nullsafety 是一个用于在 Flutter 中进行数据库操作的插件,它结合了 jaguar_querysqflite,并支持空安全(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();
}
回到顶部