Dart 颤振Sqflite错误表示该方法';查询';被调用为空
我试图从网络中获取一些数据并将其存储在sqlite数据库中。下面是模型类Dart 颤振Sqflite错误表示该方法';查询';被调用为空,dart,flutter,Dart,Flutter,我试图从网络中获取一些数据并将其存储在sqlite数据库中。下面是模型类 class StudentModel { int status; String msg; StudentModelData studentModelData; StudentModel({this.status, this.msg, this.studentModelData}); StudentModel.fromJson(Map<String, dynamic> json) {
class StudentModel {
int status;
String msg;
StudentModelData studentModelData;
StudentModel({this.status, this.msg, this.studentModelData});
StudentModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
msg = json['msg'];
studentModelData = json['data'] != null ? new StudentModelData.fromJson(json['data']) : null;
}
StudentModel.fromDb(Map<String, dynamic> parsedJson) {
status = parsedJson['status'];
msg = parsedJson['msg'];
studentModelData = studentModelData = jsonDecode(json['data']) != null ? new StudentModelData.fromJson(jsonDecode(json['data'])) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['msg'] = this.msg;
if (this.studentModelData != null) {
data['data'] = this.studentModelData.toJson();
}
return data;
}
}
class StudentModelData {
int lastIndex;
List<StudentData> studentData;
StudentModelData({this.lastIndex, this.studentData});
StudentModelData.fromJson(Map<String, dynamic> json) {
lastIndex = json['lastIndex'];
if (json['studentData'] != null) {
studentData = new List<StudentData>();
json['studentData'].forEach((v) {
studentData.add(new StudentData.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['lastIndex'] = this.lastIndex;
if (this.studentData != null) {
data['studentData'] = this.studentData.map((v) => v.toJson()).toList();
}
return data;
}
}
class StudentData {
String studentId;
String studName;
String studProfilepic;
String studentEmail;
String studentMobile;
String courseName;
String classCode;
int minAvg;
int avg;
StudentData(
{this.studentId,
this.studName,
this.studProfilepic,
this.studentEmail,
this.studentMobile,
this.courseName,
this.classCode,
this.minAvg,
this.avg});
StudentData.fromJson(Map<String, dynamic> json) {
studentId = json['student_id'];
studName = json['stud_name'];
studProfilepic = json['stud_profilepic'];
studentEmail = json['student_email'];
studentMobile = json['student_mobile'];
courseName = json['course_name'];
classCode = json['class_code'];
minAvg = json['minAvg'];
avg = json['avg'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['student_id'] = this.studentId;
data['stud_name'] = this.studName;
data['stud_profilepic'] = this.studProfilepic;
data['student_email'] = this.studentEmail;
data['student_mobile'] = this.studentMobile;
data['course_name'] = this.courseName;
data['class_code'] = this.classCode;
data['minAvg'] = this.minAvg;
data['avg'] = this.avg;
return data;
}
}
数据被添加到数据库中,但我无法从数据库中查询数据。至少减少您的示例,这会引发异常
方法“query”被调用为null
因为在正确初始化db
之前执行fetch
:
class Database {
Future<int> query() {
return Future.value(1);
}
}
const oneSecond = Duration(seconds: 1);
class Provider {
Database db;
Provider() {
init();
}
void init() async {
db = await Future.delayed(oneSecond, () => Database());
}
Future<int> fetch() {
return db.query();
}
}
main() async {
var provider = Provider();
await provider.fetch();
}
类数据库{
未来查询(){
返回未来值(1);
}
}
const oneSecond=持续时间(秒:1);
类提供者{
数据库数据库;
提供者(){
init();
}
void init()异步{
db=wait Future.delayed(一秒钟,()=>Database());
}
未来获取(){
返回db.query();
}
}
main()异步{
var provider=provider();
等待provider.fetch();
}
问题在于调用构造函数内的异步方法,另请参见:
class Database {
Future<int> query() {
return Future.value(1);
}
}
const oneSecond = Duration(seconds: 1);
class Provider {
Database db;
Provider() {
//init();
}
void init() async {
db = await Future.delayed(oneSecond, () => Database());
}
Future<int> fetch() {
return db.query();
}
}
main() async {
var provider = Provider();
await provider.init();
await provider.fetch();
}
类数据库{
未来查询(){
返回未来值(1);
}
}
const oneSecond=持续时间(秒:1);
类提供者{
数据库数据库;
提供者(){
//init();
}
void init()异步{
db=wait Future.delayed(一秒钟,()=>Database());
}
未来获取(){
返回db.query();
}
}
main()异步{
var provider=provider();
等待provider.init();
等待provider.fetch();
}
请注意,必须等待
init
,否则您将捕获相同的,方法“query”是在null上调用的
问题是必须等待init。这是我为修复它所做的
_onCreate(Database db, int version) async {
await db.execute('CREATE TABLE ... <YOUR QUERY CREATION GOES HERE>');
}
Future<Database> getDatabaseInstance() async {
final String databasesPath = await getDatabasesPath();
final String path = join(databasesPath, '<YOUR DB NAME>');
return await openDatabase(path, version: 1, onCreate: _onCreate);
}
Future<int> save(Contact contact) {
return getDatabaseInstance().then((db) {
final Map<String, dynamic> contactMap = Map();
contactMap['name'] = contact.name;
contactMap['account_number'] = contact.accountNumber;
return db.insert('contacts', contactMap);
});
}
\u onCreate(数据库数据库数据库,int版本)异步{
等待db.execute('createtable…');
}
未来的getDatabaseInstance()异步{
最后一个字符串databasesPath=等待getDatabasesPath();
最终字符串路径=join(databasesPath',);
返回等待openDatabase(路径,版本:1,onCreate:_onCreate);
}
未来保存(联系方式){
返回getDatabaseInstance()。然后((db){
最终映射contactMap=Map();
contactMap['name']=contact.name;
contactMap['account_number']=contact.accountNumber;
返回db.insert('contacts',contactMap);
});
}
SQFlite页面提供了一个很好的例子,帮助很大。
错误已经表明您的db变量为null。您正在调用构造函数中的异步方法。看看这个:。可能重复?@Apin我不认为db变量是null@attdona我尝试显式调用init方法,但仍然不起作用。我正在学习我的课程,我将分享eg的github链接,该代码与此类似,但它可以正常工作。如果您认为db不为null,请在调用db.query之前尝试打印(db==null),并查看dart和Flatter的想法。如果您第二次运行应用程序,则该解决方案仅在第一次运行时有效,您将得到相同的错误
class Database {
Future<int> query() {
return Future.value(1);
}
}
const oneSecond = Duration(seconds: 1);
class Provider {
Database db;
Provider() {
//init();
}
void init() async {
db = await Future.delayed(oneSecond, () => Database());
}
Future<int> fetch() {
return db.query();
}
}
main() async {
var provider = Provider();
await provider.init();
await provider.fetch();
}
_onCreate(Database db, int version) async {
await db.execute('CREATE TABLE ... <YOUR QUERY CREATION GOES HERE>');
}
Future<Database> getDatabaseInstance() async {
final String databasesPath = await getDatabasesPath();
final String path = join(databasesPath, '<YOUR DB NAME>');
return await openDatabase(path, version: 1, onCreate: _onCreate);
}
Future<int> save(Contact contact) {
return getDatabaseInstance().then((db) {
final Map<String, dynamic> contactMap = Map();
contactMap['name'] = contact.name;
contactMap['account_number'] = contact.accountNumber;
return db.insert('contacts', contactMap);
});
}