Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 颤振Sqflite错误表示该方法';查询';被调用为空_Dart_Flutter - Fatal编程技术网

Dart 颤振Sqflite错误表示该方法';查询';被调用为空

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) {

我试图从网络中获取一些数据并将其存储在sqlite数据库中。下面是模型类

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);
  });
}