flutter 如何让sqflite数据库更快?

new9mtju  于 2023-03-04  发布在  Flutter
关注(0)|答案(3)|浏览(223)

我正在尝试开发一个应用程序。在这个应用程序中,我需要一个本地数据库。我选择了sqflite数据库,但它非常慢。它需要这么多的时间来获取和插入数据。这是我的数据库助手类。正如你可以在代码中看到,我有很多行。我是新的问题,如果你需要更多的信息,你可以评论。

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart' as sqf;

class DataBaseHelper {
  static Future<sqf.Database> database() async {
    final dbPath = sqf.getDatabasesPath();
    return sqf.openDatabase(
      join(await dbPath, 'habits_record.db'),
      onCreate: (db, version) async {
        await db.transaction((txn) async {
          var batch = txn.batch();
          await txn.execute(
            '''CREATE TABLE habitTable(id INTEGER PRIMARY KEY, title TEXT, reason TEXT,plan TEXT, iconData TEXT,hour INTEGER, minute INTEGER, notificationText TEXT, notificationId INTEGER,alarmHour INTEGER, alarmMinute INTEGER)''',
          );

          await txn.execute(
            '''CREATE TABLE event(id TEXT PRIMARY KEY, dateTime TEXT, habitId INTEGER)''',
          );
          await txn.execute(
            '''CREATE TABLE note(id TEXT PRIMARY KEY, dateTime TEXT, habitId INTEGER, Note TEXT)''',
          );
          await batch.commit();
        });
      },
      version: 1,
    );
  }

  static Future<void> insertNote(Map<String, Object> data) async {
    final db = await DataBaseHelper.database();
    db.insert('note', data, conflictAlgorithm: sqf.ConflictAlgorithm.replace);
   
  }

  static Future<void> deleteNote(String id) async {
    final db = await DataBaseHelper.database();
   
    await db.delete(
      'note',
      where: 'id = ?',
      whereArgs: [id],
    );
  }

  static Future<List<Map<String, dynamic>>> fetchAndSetNotes() async {
    final db = await DataBaseHelper.database();

    return await db.query('note');
  }

  static Future<void> updateNote(Map<String, Object> newNote) async {
    final db = await DataBaseHelper.database();
    final batch = db.batch();
    batch.update(
      'note', newNote, where: 'id = ?',
      whereArgs: [newNote['id']],
    );
 
    batch.commit(continueOnError: true);
  }

  static Future<void> insertEvent(Map<String, Object> data) async {
    final db = await database();
    await db.insert('event', data,
        conflictAlgorithm: sqf.ConflictAlgorithm.replace);
  }

  static Future<void> deleteEvent(String id) async {
    final db = await DataBaseHelper.database();

    await db.delete(
      'event',
      where: 'id = ?',
      whereArgs: [id],
    );
  }

  static Future<List<Map<String, dynamic>>> fethEvent() async {
    final db = await DataBaseHelper.database();

    return await db.query('event');
  }

  static Future<void> insertHabit(Map<String, Object> data) async {
    final db = await database();
    await db.insert('habitTable', data,
        conflictAlgorithm: sqf.ConflictAlgorithm.replace);
  }

  static Future<List<Map<String, dynamic>>> habits() async {
    final db = await DataBaseHelper.database();

    return await db.query('habitTable');
  }

  static Future<void> deleteHabit(int id) async {
    final db = await DataBaseHelper.database();

    await db.delete(
      'habitTable',
      where: 'id = ?',
      whereArgs: [id],
    );
  }

  static Future<void> updateHabit(Map<String, Object> oneHabit) async {
    final db = await DataBaseHelper.database();

    await db.update(
      'habitTable',
      oneHabit,
      where: 'id = ?',
      whereArgs: [oneHabit['id']],
    );
  }
}
eaf3rand

eaf3rand1#

下面是对象框配置单元

Sqflite性能基准测试。

你可以决定你想和哪一个一起去。
在CRUD操作中,您可以看到sqflite与其他操作相比非常慢。

ac1kyiln

ac1kyiln2#

如果sqflite没有您想要的速度,您可以使用hiveobjectbox

fkvaft9z

fkvaft9z3#

考虑使用一个大批量的所有操作。
批处理用于作为单个原子单元执行多个操作
https://pub.dev/documentation/sqflitezjl/latest/sqflite/Batch-class.html

Batch batch = _database!.batch();

for (final item in ...) {
  batch.insert(...);
}

await batch.commit(noResult: true);

相关问题