我正在尝试在 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/