Flutter SQLite数据库管理插件psqlite的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter SQLite数据库管理插件PSQLite的使用

PSQLite简介

pub package

PSQLite 是一个用于Dart中轻松操作SQLite数据库的包。以下是该包设计的对象结构:

  • TableDb:定义数据库中的表,由多个ColumnDb对象组成,并包含表名。
  • ColumnDb:定义数据库表的列,TableDb对象由多个ColumnDb对象构成。
  • FieldTypeDb:定义数据库表中列值的类型。SQLite没有单独的布尔存储类,而是用整数0(假)和1(真)来表示布尔值。
  • ObjectStored:所有打算存储在SQLite数据库中的对象都应扩展此类。
  • PSQLite:封装了一个由TableDb和数据库名组成的数据库。
  • FilterDb:定义过滤器以优化SQLite查询。
  • ConditionDb:定义过滤条件的类型。

使用示例

创建User类

import 'package:psqlite/psqlite.dart';

class User extends ObjectStored {
  final String _id;
  String _name;
  String _lastName;
  int _age;

  User(this._id, this._name, this._lastName, this._age);

  User.fromJson(this._id, this._name, this._lastName, this._age);

  String getId() => _id;
  String getName() => _name;
  String getLastName() => _lastName;
  int getAge() => _age;

  void setName(String name) => _name = name;
  void setLastName(String lastName) => _lastName = lastName;
  void setAge(int age) => _age = age;

  @override
  String toString() =>
      'User{_id: $_id, _name: $_name, _lastName: $_lastName, _age: $_age}';

  @override
  Map<String, dynamic> toMap() {
    return {'id': _id, 'name': _name, 'lastName': _lastName, 'age': _age};
  }

  @override
  String getPrimaryKey() => _id;

  @override
  bool operator ==(Object other) {
    if (other is! User) return false;
    if (_id != other._id) return false;
    if (_name != other._name) return false;
    if (_lastName != other._lastName) return false;
    if (_age != other._age) return false;
    return true;
  }

  @override
  int get hashCode {
    var result = 17;
    result = 37 * result + _id.hashCode;
    result = 37 * result + _name.hashCode;
    result = 37 * result + _lastName.hashCode;
    result = 37 * result + _age.hashCode;
    return result;
  }
}

创建User Storage Service

import 'package:psqlite/psqlite.dart';
import 'user.dart';

enum UserColumnName { id, name, lastName, age }

class UserStorageService {
  static final shared = UserStorageService.init();
  late PSQLite _database;
  final _tableName = 'users';

  UserStorageService.init({bool mockedDatabase = false}) {
    List<ColumnDb> columns = [
      ColumnDb(
          name: UserColumnName.id.name,
          type: FieldTypeDb.text,
          isPrimaryKey: true),
      ColumnDb(name: UserColumnName.name.name, type: FieldTypeDb.text),
      ColumnDb(name: UserColumnName.lastName.name, type: FieldTypeDb.text),
      ColumnDb(name: UserColumnName.age.name, type: FieldTypeDb.integer)
    ];
    final table = TableDb.create(name: _tableName, columns: columns);
    _database = PSQLite(table: table, isMocked: mockedDatabase);
  }

  PSQLite getDatabase() => _database;

  Future<void> addUser(User user) async {
    await _database.insertElement(user);
  }

  Future<void> updateUser(User user) async {
    await _database.updateElement(user);
  }

  Future<bool> removeUser(User user) async {
    return await _database.deleteElement(user);
  }

  Future<User?> getUser(String id) async {
    final response = await _database.getElementBy(id);
    if (response != null) {
      return User(
          response[UserColumnName.id.name],
          response[UserColumnName.name.name],
          response[UserColumnName.lastName.name],
          response[UserColumnName.age.name]);
    }
    return null;
  }

  Future<List<User>> getListOfUsers({List<FilterDb> where = const []}) async {
    final maps = await _database.getElements(where: where);
    return List.generate(maps.length, (i) {
      return User(
          maps[i][UserColumnName.id.name],
          maps[i][UserColumnName.name.name],
          maps[i][UserColumnName.lastName.name],
          maps[i][UserColumnName.age.name]);
    });
  }

  Future<void> removeUsers(List<FilterDb> filters) async {
    await _database.deleteElements(where: filters);
  }

  Future<void> removeAll() async {
    await _database.clearTable();
  }
}

使用实例

创建User Storage Service

你可以创建单个对象:

final storageService = UserStorageService.init();

或者使用单例模式获取共享实例:

final storageService = UserStorageService.shared;

添加新用户到SQLite

final storageService = UserStorageService.init();
final user = User("1", "Liam", "Neeson", 18);
await storageService.addUser(user);

更新SQLite中存储的用户

final storageService = UserStorageService.init();
// 添加新用户部分
User user = User("1", "Liam", "Neeson", 18);
await storageService.addUser(user);
// 更新用户部分
user.setLastName(finalLastName);
await storageService.updateUser(user);

获取SQLite中存储的用户列表

final storageService = UserStorageService.init();
await storageService.getListOfUsers();

获取过滤后的用户列表

final storageService = UserStorageService.init();
List<FilterDb> filters = [
  FilterDb(UserColumnName.lastName.name, "Neeson", ConditionDb.equal),
  FilterDb(UserColumnName.age.name, 18, ConditionDb.greaterOrEqual)
];
final filteredUsers = await storageService.getListOfUsers(where: filters);

删除SQLite中存储的用户

final storageService = UserStorageService.init();
final user = User("1", "Liam", "Neeson", 18);
await storageService.removeUser(user);

删除SQLite中所有的用户

你可以通过调用removeAll方法或不带过滤参数调用removeUsers方法来删除所有用户。

final storageService = UserStorageService.init();
await storageService.removeAll();

final storageService = UserStorageService.init();
await storageService.removeUsers();

以上是关于如何在Flutter项目中使用PSQLite进行SQLite数据库管理的基本介绍和示例代码。希望这些信息能帮助你更好地理解和使用这个插件。


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

1 回复

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


在Flutter中,psqlite 是一个用于管理 SQLite 数据库的插件。虽然 psqlite 并不是官方推荐或者广泛使用的插件(通常人们更倾向于使用 sqflite),但我们可以展示如何使用类似的 SQLite 管理插件来进行基本的数据库操作。由于 psqlite 的具体实现和文档可能较为有限,这里我会提供一个使用 sqflite 的示例,因为 sqflite 是 Flutter 社区中广泛接受和使用的 SQLite 数据库管理插件。

首先,确保在 pubspec.yaml 文件中添加 sqflite 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.2  # 请检查最新版本号

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

以下是一个使用 sqflite 进行数据库管理的示例代码,包括创建数据库、创建表、插入数据、查询数据和关闭数据库的基本操作:

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SQLite Demo'),
        ),
        body: DatabaseDemo(),
      ),
    );
  }
}

class DatabaseDemo extends StatefulWidget {
  @override
  _DatabaseDemoState createState() => _DatabaseDemoState();
}

class _DatabaseDemoState extends State<DatabaseDemo> {
  Database? _db;

  @override
  void initState() {
    super.initState();
    _initDatabase();
  }

  Future<void> _initDatabase() async {
    // 获取应用文档目录
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, 'demo.db');

    // 打开数据库
    _db = 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 NOT NULL,
        age INTEGER NOT NULL
      )
    ''');
  }

  Future<void> _insertData() async {
    if (_db != null) {
      await _db!.insert(
        'users',
        {'name': 'Alice', 'age': 30},
        conflictAlgorithm: ConflictAlgorithm.replace,
      );
    }
  }

  Future<List<Map<String, dynamic>>> _queryData() async {
    if (_db != null) {
      return await _db!.query('users');
    } else {
      return [];
    }
  }

  Future<void> _closeDatabase() async {
    if (_db != null) {
      await _db!.close();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: () async {
              await _insertData();
              print('Data inserted');
            },
            child: Text('Insert Data'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () async {
              List<Map<String, dynamic>> users = await _queryData();
              print('Users: $users');
            },
            child: Text('Query Data'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () async {
              await _closeDatabase();
              print('Database closed');
            },
            child: Text('Close Database'),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    _closeDatabase();
    super.dispose();
  }
}

在这个示例中,我们展示了如何:

  1. initState 方法中初始化数据库。
  2. _onCreate 方法中创建表。
  3. 使用 _insertData 方法插入数据。
  4. 使用 _queryData 方法查询数据。
  5. 使用 _closeDatabase 方法关闭数据库。

请注意,sqflite 是处理 SQLite 数据库的一个流行且功能强大的插件,而 psqlite 可能具有不同的 API 和实现细节。如果你确实需要使用 psqlite,建议查阅其官方文档或仓库以获取具体的用法和示例。如果 psqlite 的 API 与 sqflite 类似,上述代码结构可以作为参考,并根据 psqlite 的文档进行相应调整。

回到顶部