san*_*osh 5 sql database dart flutter sqflite
我正在使用 flutter 制作 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]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我用于 databasehelper 的代码....它在 _database 中显示错误,如下所示:
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
jul*_*101 17
您的代码中有两个问题,都来自于 2.12.0 版引入的新 Dart 默认不可为空 (NNBD) 功能。这两个问题都可以在以下部分中找到:
static Database _database;
Future<Database> get database async {
if (_database == null) {
_database = await _initiateDatabase();
}
return _database;
}
Run Code Online (Sandbox Code Playgroud)
首先,在 Dart 2.12.0 中,Database表示不允许null作为值的类型。在您的情况下,您定义了一个_database未使用任何值初始化的变量。所以这个变量将具有 value null。但Database不允许这样做。
相反,我们需要使用Database?允许我们指向Database对象或的类型null:
static Database? _database;
Future<Database> get database async {
if (_database == null) {
_database = await _initiateDatabase();
}
return _database;
}
Run Code Online (Sandbox Code Playgroud)
现在我们遇到了一个新问题:
static Database _database;
Future<Database> get database async {
if (_database == null) {
_database = await _initiateDatabase();
}
return _database;
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是 Dart 空安全特性在执行if (_database == null). 您可以在此处阅读更多相关信息以及原因:Dart null 安全不适用于类字段
为了解决这个问题,我们可以将您的代码重写为:
static Database? _database;
Future<Database> get database async =>
_database ??= await _initiateDatabase();
Run Code Online (Sandbox Code Playgroud)
该??=运营商将检查是否_database是null并将其设置为的值await _initiateDatabase(),如果是这样的话,然后返回的新值_database。如果_database已经有一个值,它只会被返回。
可以在此处找到 Dart 中空感知运算符的良好列表:https : //medium.com/@thinkdigitalsoftware/null-aware-operators-in-dart-53ffb8ae80bb
您可以在此处阅读有关默认情况下 Dart 不可为空的更多信息:https : //dart.dev/null-safety
奖金
我认为你也应该改变:
_initiateDatabase() async {
Run Code Online (Sandbox Code Playgroud)
到:
Future<Database> _initiateDatabase() async {
Run Code Online (Sandbox Code Playgroud)
由于我们不知道_initiateDatabase返回的是哪种类型,因此 Dart 会假设它dynamic不是您想要的类型。
| 归档时间: |
|
| 查看次数: |
4547 次 |
| 最近记录: |