Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Sql 不可为空的变量'_数据库';必须初始化_Sql_Database_Flutter_Dart_Sqflite - Fatal编程技术网

Sql 不可为空的变量'_数据库';必须初始化

Sql 不可为空的变量'_数据库';必须初始化,sql,database,flutter,dart,sqflite,Sql,Database,Flutter,Dart,Sqflite,我正在使用flatter制作一个Windows应用程序,在使用sqflite制作一个数据库时,突然出现了这个错误,我不知道如何真正解决这个问题 import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; class DatabaseHelper { static fin

我正在使用flatter制作一个Windows应用程序,在使用sqflite制作一个数据库时,突然出现了这个错误,我不知道如何真正解决这个问题

import 'dart:io';

import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final _dbName = 'Database.db';
  static final _dbVersion = 1;
  static final _tableName = 'my table';

  static final columnId = '_id';
  static final columnName = 'name';

  DatabaseHelper._privateConstuctor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstuctor();

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

  _initiateDatabase() async {
    Directory directory = await getApplicationDocumentsDirectory();
    String path = join(directory.path, _dbName);
    return await openDatabase(path, version: _dbVersion, onCreate: _onCreate);
  }

  Future _onCreate(Database db, int version) async {
    await db.execute(''' 
          CREATE TABLE $_tableName ( 
          $columnId INTEGER PRIMARY KEY,
          $columnName TEXT NOT NULL)
          
          
          ''');
  }

  Future<int> insert(Map<String, dynamic> row) async {
    Database db = await instance.database;
    return await db.insert(_tableName, row);
  }

  Future<List<Map<String, dynamic>>> queryAll() async {
    Database db = await instance.database;
    return await db.query(_tableName);
  }

  Future<int> update(Map<String, dynamic> row) async {
    Database db = await instance.database;
    int id = row[columnId];
    return await db
        .update(_tableName, row, where: '$columnId = ?', whereArgs: [id]);
  }

  Future<int> delete(int id) async {
    Database db = await instance.database;
    return await db.delete(_tableName, where: '$columnId = ?', whereArgs: [id]);
  }
}

代码中存在两个问题,这两个问题都来自版本2.12.0引入的新Dart默认不可为空(NNBD)功能。这两个问题都可以在以下部分中找到:

  static Database _database;
  Future<Database> get database async {
    if (_database == null) {
      _database = await _initiateDatabase();
    }
    return _database;
  }
现在我们遇到了一个新问题:

无法从函数“Database”返回类型为“Database”的值,因为它的返回类型为“Future”
原因是,如果(_database==null)执行
操作时,Dart null安全功能不会提升类字段。您可以在此处了解更多信息以及原因:

要解决此问题,我们可以将您的代码重写为:

  static Database? _database;
  Future<Database> get database async =>
      _database ??= await _initiateDatabase();
致:

Future\u initialedatabase()异步{
由于我们不知道哪种类型的
\u initiateDatabase
返回,因此Dart将假定它是
动态的
,而这恰恰不是您想要的。

也许这会对您有所帮助, 请按如下方式进行更改


sdk:">=2.12.0=2.7.0您的变量
static Database\u Database;
在初始化时未分配任何值。因此该值将为
null
。但由于您使用的是Dart 2.12,因此类型
Database
是不可为null的类型,因此它永远不能为
null
。如果您希望允许它具有值
null
>,您应该将类型更改为
数据库?
,这允许变量指向
数据库
对象或
。谢谢,它工作了,但现在显示“类型为“Database”的值无法从函数“Database”返回,因为它的返回类型为“Future”。谢谢你的帮助和链接。这真的很有帮助。。@sanjay.k.santhosh我们还有其他问题需要解决吗?如果没有,请接受我的回答。:)
  static Database? _database;
  Future<Database> get database async =>
      _database ??= await _initiateDatabase();
_initiateDatabase() async {
Future<Database> _initiateDatabase() async {