android - 在 sqflite 数据库创建时插入记录

标签 android ios flutter sqflite

我正在尝试在 android 中创建 Sqflite 数据库,并在创建时插入一些记录。我不想有 asset_db,因为我必须在一张表中只插入 5-6 条记录。

我试着做这样的事情

initDatabase() async {
  String path = join(await getDatabasesPath(), DATABASE_NAME);

  print('Init Database');

  return await openDatabase(
    path,
    version: DATABASE_VERSION,
    onOpen: (db) async {
      print("Opened Database $DATABASE_NAME");
    },
    onCreate: _onCreate,
  );
}

_onCreate(Database db, int version) async {
 print("Creating new database with version $version");

  await db.execute("CREATE TABLE IF NOT EXISTS categories ("
      "id INTEGER PRIMARY KEY,"
      "name VARCHAR(50) NOT NULL,"
      ")");

  await _createDefaultCategories();
}

在 _createDefaultCategories 中,我使用 db 进行了几次插入。

我遇到的问题是,当我使用数据库并调用 init 时,我永远陷入无限循环打印:

I/flutter (10003): Creating new database with version 1
I/flutter (10003): Init Database
I/flutter (10003): Creating new database with version 1
I/flutter (10003): Init Database
I/flutter (10003): Creating new database with version 1
I/flutter (10003): Init Database
I/flutter (10003): Creating new database with version 1

我做错了什么?

乐: _createDefaultCategories 是这样的:

_createDefaultCategories() async {
    var database = await DBHelper.instance.database;

    await database.insert('Category', Category(id: 1).toMap());
}

我初始化数据库的助手是:

class DBHelper {
    DBHelper._();

    static final DBHelper instance = DBHelper._();

    static Database _database;

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

        _database = await initDatabase();

        return _database;
    }

    initDatabase() { 
      ...above code...
    }
}

最佳答案

这个问题看起来像是在您创建数据库时,您正在尝试使用实际上尚未完成创建的数据库对象。

不是让您的 _createDefaultCategories 方法获取数据库实例,而是将其作为参数传入,而不是像这样:

Future<void> _createDefaultCategories(Database database) async {
  await database.insert('Category', Category(id: 1).toMap());
}

然后从您的 _onCreate 方法调用它,如下所示:

await _createDefaultCategories(db);

除此之外,您的 database 属性略有错误。它应该在正文之前有一个 async 关键字。

这是您可能要实现的目标的完整示例:

class DBHelper {
  DBHelper._();

  static final DBHelper instance = DBHelper._();

  static Database _database;

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

    _database = await initDatabase();

    return _database;
  }

  initDatabase() async { 
    String path = join(await getDatabasesPath(), DATABASE_NAME);

    print('Init Database');

    return await openDatabase(
      path,
      version: DATABASE_VERSION,
      onOpen: (db) async {
        print("Opened Database $DATABASE_NAME");
      },
      onCreate: _onCreate,
    );
  }

  _onCreate(Database db, int version) async {
    print("Creating new database with version $version");

    // this could also be part of some kind of seed method
    await db.execute("CREATE TABLE IF NOT EXISTS categories ("
        "id INTEGER PRIMARY KEY,"
        "name VARCHAR(50) NOT NULL,"
        ")");

    await _createDefaultCategories(db);
  }

  Future<void> _createDefaultCategories(Database database) async {
    await database.insert('Category', Category(id: 1).toMap());
  }
}

关于android - 在 sqflite 数据库创建时插入记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58493400/

相关文章:

ios - 与 Firestore 监听器分离

ios - 如何在不转换为 Swift 中的任何时区的情况下将字符串更改为日期?

flutter - 检测 Flutter 中的手势速度

java - 如何用随机整数填充数组并创建一个按钮来激活它

java - Android SSL - 不适用于 API 7

ios - In-Memory Realm 是否有 Swift 中磁盘持久化 Realm 数据的副本?

flutter - 如何使用数字验证器将 FlatButton 转换为 textButton

flutter - flutter 列表手动嵌套json

android - 干净地退出android应用程序

Android firebase 推送通知最低版本问题