【发布时间】:2018-10-10 13:33:32
【问题描述】:
我在我的应用程序中使用 SQFLite 颤振包。但是,由于与数据库的连接,我一直为空。下面是我在初始化数据库、创建表以及添加和获取项目的方法中使用的代码:
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:path/path.dart';
import 'dart:async';
class StoreDBProvider {
Database db;
init() async {
Directory documentsDirectory = await
getApplicationDocumentsDirectory();
final path = join(documentsDirectory.path, "carts.db");
db = await openDatabase(
path,
version: 3,
onCreate: (Database newDB, int version){
newDB.execute('CREATE TABLE Cart (id INTEGER
PRIMARY KEY, name TEXT, price DOUBLE, image TEXT, rating DOUBLE)');
}
);
return db;
}
Future<dynamic> fetchItem(int id) async {
print("DB CONNECTION IS: $db");
final maps = await db.query(
"Cart",
columns: null,
where: "id = ?",
whereArgs: [id],
);
print(maps);
if(maps.length > 0){
print("Data exists");
return maps.first;
}
return null;
}
Future<int> addItem(item) async{
return db.insert("Cart", item);
}
}
经过一些调试,我注意到“db”值为空。这是错误消息:
E/flutter ( 6921): [ERROR:flutter/shell/common/shell.cc(182)] Dart
Error: Unhandled exception:
E/flutter ( 6921): NoSuchMethodError: The method 'insert' was called on null.
E/flutter ( 6921): Receiver: null
E/flutter ( 6921): Tried calling: insert("Cart", _LinkedHashMap len:5)
E/flutter ( 6921): #0 Object.noSuchMethod
(dart:core/runtime/libobject_patch.dart:50:5)
E/flutter ( 6921): #1 StoreDBProvider.addItem
(file:///Users/Oluwashola/workspace/fashion_style/lib/src/resources/store_db_provider.dart:46:15)
请在此提供任何帮助,我们将不胜感激。谢谢。
【问题讨论】:
-
在调用
addItem之前是否调用了init()方法? -
我假设 Flutter 在实例化其类时调用了 init() 方法。此外,不可能通过对象引用调用该方法:例如:storeDBProviderobject.init()。这会出错。
-
在我的应用程序中,我有这样的方法,名为
open(),我必须在每次交易之前调用它。那么,也许您会尝试重命名它并在保存项目之前调用它? -
我无法正常调用该方法;如果我尝试使用对象引用在另一个类中调用它,我会收到错误消息“无效的构造函数名称”。我也在我打算使用它的课堂上试过这个,但还是一样。 init(){ setState(() { storeDB.open(); }); }
-
为什么要放在setState里面?尝试
storeDB = StoreDBProvider(),然后是await storeDB.open(),然后是await storeDB.addItem(...)
标签: android sqlite dart flutter