Flutter数据库操作插件sql_utilities的使用

Flutter数据库操作插件sql_utilities的使用

使用

var someUserSuppliedValue = 'littlebobbytables';
var boundParams = {};
var sql = 'SELECT * FROM foo WHERE ' + PostgresUtils.bindEquals('field1', someUserSuppliedValue, boundParams) + ' ORDER BY field2 ASC'; 

上述代码将生成:

  • sql: SELECT * FROM foo WHERE field1 = @0 ORDER BY field2 ASC
  • boundParams: {0: 'littlebobbytables'}

你也可以显式命名绑定参数,并在查询中重复使用它:

var someUserSuppliedValue = 'littlebobbytables';
var boundParams = {};
var sql = 'SELECT * FROM foo WHERE ' + PostgresUtils.bindEquals('field1', someUserSuppliedValue, boundParams, name: 'customName') + ' OR field2 = @customName'; 

这将生成:

  • sql: SELECT * FROM foo WHERE field1 = @customName OR field2 = @customName
  • boundParams: {'customName': 'littlebobbytables'}

还可以使用如bindContains()bindStartsWithAny()bindRegex()等方法来生成复杂的匹配语句:

var startingValues = ['lorem', 'ipsum', 'dolor'];
var endingValues   = ['sit', 'amet', 'consectetur'];
var boundParams = {};
var sql = 'SELECT * FROM foo WHERE ' + PostgresUtils.andGroup([
  PostgresUtils.bindStartsWithAny('field1', startingValues, boundParams),
  PostgresUtils.bindEndsWithAny('field2', endingValues, boundParams),
  PostgresUtils.bindRegex('field3', RegExp(r'yourpatternhere', caseSensitive: true, multiLine: true), boundParams, name: 'matchPattern'),
]);

这将生成:

  • sql:

    SELECT * FROM foo WHERE (
      (field1 LIKE @0 OR field1 LIKE @1 OR field1 LIKE @2)
      AND (field2 LIKE @3 OR field2 LIKE @4 OR field2 LIKE @5)
      AND field3 REGEXP(@matchPattern, im)
    )
    
  • boundParams:

    {
      '0'           : 'lorem%',
      '1'           : 'ipsum%',
      '2'           : 'dolor%',
      '3'           : '%sit',
      '4'           : '%amet',
      '5'           : '%consectetur',
      'matchPattern': 'yourpatternhere'
    }
    

支持的方言

  • MySQL
  • PostgreSQL

可用的方法

  • inClause()
  • bindInClause()
  • bindParam()
  • bindParams()
  • bindInsertValuesMap()
  • bindUpdateValuesMap()
  • bindGreaterThan()
  • bindGreaterThanOrEqual()
  • bindLessThan()
  • bindLessThanOrEqual()
  • bindEquals()
  • bindContains()
  • bindStartsWith()
  • bindEndsWith()
  • bindRegex()
  • bindEqualsAny()
  • bindContainsAny()
  • bindStartsWithAny()
  • bindEndsWithAny()
  • bindRegexAny()
  • orGroup()
  • andGroup()

特性和问题

目前,请通过电子邮件向作者提交功能请求和错误报告。


完整示例代码

// 忽略未使用的局部变量
import 'dart:convert';
import 'package:sql_utilities/sql_utilities.dart';

void main() {
  var startingValues = ['lorem', 'ipsum', 'dolor'];
  var endingValues   = ['sit', 'amet', 'consectetur'];

  Map<String, dynamic> boundParams = {};
  var sql = 'SELECT * FROM foo WHERE ' + PostgresUtils.andGroup([
    PostgresUtils.bindStartsWithAny('field1', startingValues, boundParams),
    PostgresUtils.bindEndsWithAny('field2', endingValues, boundParams),
    PostgresUtils.bindRegex('field3', RegExp(r'yourpatternhere', caseSensitive: false, multiLine: true), boundParams, name: 'matchPattern'),
  ]);

  print(JsonEncoder.withIndent('  ').convert({
    'sql'        : sql,
    'boundParams': boundParams,
  }));

  // 现在只需将你的sql和boundParams传递给orm/连接库
  // 例如:
  // var results = await myConnection.query(sql, boundParams);
}

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

1 回复

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


sql_utilities 是一个用于简化 Flutter 中 SQLite 数据库操作的插件。它提供了一些实用工具和扩展方法,使得在 Flutter 中使用 SQLite 更加方便和简洁。以下是如何使用 sql_utilities 插件进行数据库操作的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sql_utilities: ^0.2.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化数据库

在使用 sql_utilities 之前,你需要初始化数据库。你可以使用 DatabaseHelper 类来管理数据库的创建和版本控制。

import 'package:sql_utilities/sql_utilities.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

  Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await _initDatabase();
    return _database;
  }

  _initDatabase() async {
    String path = '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. 插入数据

使用 DatabaseHelper 来插入数据:

Future<void> insertUser(User user) async {
  final db = await DatabaseHelper().database;
  await db.insert(
    'users',
    user.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

User 类的定义:

class User {
  int id;
  String name;
  int age;

  User({this.id, this.name, this.age});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }
}

4. 查询数据

使用 DatabaseHelper 来查询数据:

Future<List<User>> getUsers() async {
  final db = await DatabaseHelper().database;
  final List<Map<String, dynamic>> maps = await db.query('users');

  return List.generate(maps.length, (i) {
    return User(
      id: maps[i]['id'],
      name: maps[i]['name'],
      age: maps[i]['age'],
    );
  });
}

5. 更新数据

使用 DatabaseHelper 来更新数据:

Future<void> updateUser(User user) async {
  final db = await DatabaseHelper().database;
  await db.update(
    'users',
    user.toMap(),
    where: 'id = ?',
    whereArgs: [user.id],
  );
}

6. 删除数据

使用 DatabaseHelper 来删除数据:

Future<void> deleteUser(int id) async {
  final db = await DatabaseHelper().database;
  await db.delete(
    'users',
    where: 'id = ?',
    whereArgs: [id],
  );
}

7. 使用 SQL Utilities 扩展方法

sql_utilities 提供了一些扩展方法来简化常见的数据库操作。例如,你可以使用 insertWithConflict 方法来插入数据并处理冲突:

Future<void> insertUserWithConflict(User user) async {
  final db = await DatabaseHelper().database;
  await db.insertWithConflict(
    'users',
    user.toMap(),
    ConflictAlgorithm.replace,
  );
}

8. 查询单行数据

使用 queryRow 方法来查询单行数据:

Future<User> getUserById(int id) async {
  final db = await DatabaseHelper().database;
  final Map<String, dynamic> map = await db.queryRow(
    'users',
    where: 'id = ?',
    whereArgs: [id],
  );

  if (map.isNotEmpty) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  } else {
    return null;
  }
}

9. 批量插入数据

使用 batch 方法来批量插入数据:

Future<void> insertUsers(List<User> users) async {
  final db = await DatabaseHelper().database;
  final batch = db.batch();

  users.forEach((user) {
    batch.insert('users', user.toMap());
  });

  await batch.commit();
}

10. 关闭数据库

在应用程序关闭时,记得关闭数据库连接:

Future<void> closeDatabase() async {
  final db = await DatabaseHelper().database;
  await db.close();
}
回到顶部