Flutter数据库查询插件sqflite_laravel_style_queries的使用

Flutter数据库查询插件sqflite_laravel_style_queries的使用

Sqflite Easy Query 是一个为初学者设计的新Flutter项目,旨在简化SQLite查询。本文档将详细介绍如何使用该插件进行数据库操作。

开源问题反馈

如果您在使用过程中遇到任何问题,可以在GitHub仓库上提交问题。

重要提示

  • 如果您的版本低于0.0.8,请确保更新所有值以触发更新事件ID,并且在模型类中使每个变量可为空。
  • 建议使用版本1.0.0或更高版本。

第一步:仅适用于版本低于0.0.8 的扩展并添加表名到模型类

对于版本0.0.8及以下的用户,可以参考以下示例:

class UserDbModel extends AzSqflite {
  String tableName = 'users';
  // 其他字段
}

第二步:迁移

创建表的示例

注意:主键或自动递增只能用于表中的一个列,否则会抛出异常。创建表时至少需要添加一列。

版本0.0.8及以上

await AzSqflite().table('users')
  .addColumn(name: "column_name_one", type: ColumnType.integer, isPrimaryKey: true, isAutoIncrement: true)
  .addColumn(name: "column_name_two", type: ColumnType.text, isNUll: true)
  .execute();

版本0.0.8以下

await UserDbModel()
  .addColumn(name: "column_name_one", type: ColumnType.integer, isPrimaryKey: true, isAutoIncrement: true)
  .addColumn(name: "column_name_two", type: ColumnType.text, isNUll: true)
  .execute();

删除表的示例

版本0.0.8及以上

await AzSqflite().table('users').dropTable().execute();

版本0.0.8以下

await UserDbModel().dropTable().execute();

添加列到现有表的示例

版本0.0.8及以上

await AzSqflite().table('users')
  .addColumn(name: "column_name_three", type: ColumnType.text, isNUll: true)
  .execute();

版本0.0.8以下

await UserDbModel()
  .addColumn(name: "column_name_three", type: ColumnType.text, isNUll: true)
  .execute();

删除表中列的示例

目前不支持。

重命名表中列的示例

版本0.0.8及以上

await AzSqflite().table('users')
  .renameColumn(oldName: "column_name_four", newName: "column_name_four")
  .execute();

版本0.0.8以下

await UserDbModel()
  .renameColumn(oldName: "column_name_four", newName: "column_name_four")
  .execute();

第三步:表支持的查询动作

插入记录的示例

版本0.0.8及以上

AzSqflite().table('users').insert({"name": "name", "fatherName": "father"});

版本0.0.8以下

UserDbModel(name: "name", fatherName: "father").insert();

更新记录的示例

版本0.0.8及以上

AzSqflite().table('users').where("id", 1).update({"name": "name", "fatherName": "father"});

版本0.0.8以下

UserDbModel(id: 1, name: "name", fatherName: "father").where("id", 1).update();

删除记录的示例

版本0.0.8及以上

AzSqflite().table('users').where("id", 1).delete();

版本0.0.8以下

UserDbModel().delete();

获取记录的示例

版本0.0.8及以上

AzSqflite().table('users').get();

版本0.0.8以下

UserDbModel().get();

计数记录的示例

版本0.0.8及以上

AzSqflite().table('users').count();

版本0.0.8以下

UserDbModel().count();

提取特定列的示例

版本0.0.8及以上

AzSqflite().table('users').pluck('column_name');

版本0.0.8以下

UserDbModel().pluck('column_name');

第四步:处理实例输出

你可以通过以下方式获取查询实例的结果:

版本0.0.8及以上

await AzSqflite().table('users').get().queryResult;

或者

AzSqflite().table('users').get().queryResult.then((value) {
  print(value);
});

版本0.0.8以下

await UserDbModel().get().queryResult;

或者

UserDbModel().get().queryResult.then((value) {
  print(value);
});

可用方法

版本0.0.8及以上

await AzSqflite().table('users')
  // .joining('INNER JOIN table_name_2 ON table_name.id = table_name_2.id')
  // .select(['id','column_name_one']) // 选择特定列
  // .whereBetween('id', ['1','10']) // 接受数组中的两个值
  // .orWhereBetween('id', ['1','10']) // 接受数组中的两个值
  // .whereIn('id', ['1','2','3'])
  // .orWhereIn('column_name_one', '1', operator: Operator.equal)
  // .whereNotIn('column_name_one', '1', operator: Operator.equal)
  // .where('column_name_one', '1', operator: Operator.equal)
  // .orWhere('column_name_one', '1', operator: Operator.equal)
  // .whereNull(column_name_one)
  // .orderBy('column_name_two', 'DESC')
  // .groupBy('column_name')
  // .skip(1)
  // .limit(2)
  // .page(2)
  .get();

版本0.0.8以下

await UserDbModel()
  // .joining('INNER JOIN table_name_2 ON table_name.id = table_name_2.id')
  ...
  ...
  ...
  // .page(2)
  .get();

完整示例Demo

以下是一个完整的示例代码,演示了如何使用 sqflite_laravel_style_queries 插件进行基本的数据库操作:

import 'package:flutter/material.dart';
import 'package:example/models/UserModel.dart';
import 'package:sqflite_laravel_style_queries/helper/models/column_types.dart';
import 'package:sqflite_laravel_style_queries/sqflite_laravel_style_queries.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 打开数据库
  await AzSqflite().open();

  print('开始 1');

  // 创建数据库表(新方法)
  print('创建表');
  await AzSqflite().table('users6')
    .addColumn(name: "id", type: ColumnType.integer, isPrimaryKey: true, isAutoIncrement: true)
    .addColumn(name: "name", type: ColumnType.text, isNUll: true)
    .addColumn(name: "fatherName", type: ColumnType.text, isNUll: true)
    .execute();

  print('开始 2');

  // 插入记录示例
  print('插入记录');
  await AzSqflite().table('users6').insert({"name": "hassan 1", "fatherName": "Khawaja Muhammad Asghar Saqi"});
  await AzSqflite().table('users6').insert({"name": "hassan 2", "fatherName": "Khawaja Muhammad Asghar Saqi"});

  print('开始 3');

  // 获取记录示例
  print("插入后获取记录");
  print(await AzSqflite().table('users6').get());

  print('开始 4');

  // 更新记录示例
  await AzSqflite().table('users6').where('id', 1).update({"name": "hassan update 1", "fatherName": "Khawaja Muhammad Asghar Saqi"});

  print('开始 5');

  print("更新后获取记录");
  print(await AzSqflite().table('users6').get());

  print('开始 6');

  // 删除单个记录示例
  print('删除记录');
  await AzSqflite().table('users6').where('id', 1).delete();

  print('开始 7');

  print("删除一个记录后获取记录");
  print(await AzSqflite().table('users6').get());

  print('开始 8');

  // 删除所有记录示例
  print('删除所有记录');
  await AzSqflite().table('users6').delete();

  print('开始 9');

  print("删除所有记录后获取记录");
  print(await AzSqflite().table('users6').get());

  print('开始 10');

  print('计数记录');
  print(await AzSqflite().table('users6').count());

  print('开始 11');

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sqlflite Laravel Style',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.green),
        useMaterial3: false,
      ),
      home: const MyHomePage(title: 'Example of package'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Container(
        width: MediaQuery.of(context).size.width,
        child: const Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text("Example of package"),
            Text("Hassan Mehmood"),
            Text("https://zahidaz.com"),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


sqflite_laravel_style_queries 是一个 Flutter 插件,它提供了类似 Laravel 风格的数据库查询语法,简化了与 sqflite 数据库的交互。这个插件允许你使用链式调用的方式来进行数据库查询,类似于 Laravel 的 Eloquent ORM。

安装

首先,你需要在 pubspec.yaml 文件中添加 sqflite_laravel_style_queries 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  sqflite_laravel_style_queries: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本使用

  1. 初始化数据库

    首先,你需要初始化数据库并创建表。可以使用 sqfliteopenDatabase 方法来打开数据库。

    import 'package:sqflite/sqflite.dart';
    import 'package:sqflite_laravel_style_queries/sqflite_laravel_style_queries.dart';
    
    Future<void> initDatabase() async {
      final db = await openDatabase('my_database.db', version: 1,
          onCreate: (Database db, int version) async {
        await db.execute(
            'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, email TEXT)');
      });
    
      // 初始化 sqflite_laravel_style_queries
      QueryBuilder.initialize(db);
    }
    
  2. 插入数据

    你可以使用 insert 方法来插入数据。

    Future<void> insertUser() async {
      await QueryBuilder.table('users').insert({
        'name': 'John Doe',
        'email': 'john@example.com',
      });
    }
    
  3. 查询数据

    你可以使用 get 方法来查询数据。

    Future<List<Map<String, dynamic>>> getUsers() async {
      return await QueryBuilder.table('users').get();
    }
    
  4. 条件查询

    你可以使用 where 方法来添加查询条件。

    Future<List<Map<String, dynamic>>> getUserByName(String name) async {
      return await QueryBuilder.table('users').where('name', '=', name).get();
    }
    
  5. 更新数据

    你可以使用 update 方法来更新数据。

    Future<void> updateUserEmail(int id, String newEmail) async {
      await QueryBuilder.table('users').where('id', '=', id).update({
        'email': newEmail,
      });
    }
    
  6. 删除数据

    你可以使用 delete 方法来删除数据。

    Future<void> deleteUser(int id) async {
      await QueryBuilder.table('users').where('id', '=', id).delete();
    }
    

高级查询

  1. 排序

    你可以使用 orderBy 方法来对查询结果进行排序。

    Future<List<Map<String, dynamic>>> getUsersOrderedByName() async {
      return await QueryBuilder.table('users').orderBy('name', 'desc').get();
    }
    
  2. 限制和偏移

    你可以使用 limitoffset 方法来限制查询结果的数量和偏移量。

    Future<List<Map<String, dynamic>>> getUsersPaginated(int page, int perPage) async {
      return await QueryBuilder.table('users').limit(perPage).offset((page - 1) * perPage).get();
    }
    
  3. 聚合函数

    你可以使用 count, sum, avg, min, max 等聚合函数。

    Future<int> getTotalUsers() async {
      return await QueryBuilder.table('users').count();
    }
    

关闭数据库

当你不再需要数据库时,记得关闭它。

Future<void> closeDatabase() async {
  await QueryBuilder.close();
}
回到顶部