sqlite 必须初始化不可为null的变量“_db”,请尝试添加初始值设定项表达式

ig9co6j1  于 2023-01-02  发布在  SQLite
关注(0)|答案(1)|浏览(153)

我正在使用flutter开发我的移动应用程序,在我的数据库中有一个错误,我无法解决它'

import 'package:fitness_app/Login/login_data.dart';
import 'package:fitness_app/user.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:io' as io;

class DbHelper {
  static Database _db;

  static const String DB_Name = 'test.db';
  static const String Table_User = 'user';
  static const int Version = 1;

  static const String C_UserID = 'user_id';
  static const String C_UserName = 'user_name';
  static const String C_Email = 'email';
  static const String C_Password = 'password';

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDb();
    return _db;
  }

  initDb() async {
    io.Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, DB_Name);
    var db = await openDatabase(path, version: Version, onCreate: _onCreate);
    return db;
  }

  _onCreate(Database db, int intVersion) async {
    await db.execute("CREATE TABLE $Table_User ("
        " $C_UserID TEXT, "
        " $C_UserName TEXT, "
        " $C_Email TEXT,"
        " $C_Password TEXT, "
        " PRIMARY KEY ($C_UserID)"
        ")");
  }

  Future<int> saveData(UserModel user) async {
    var dbClient = await db;
    var res = await dbClient.insert(Table_User, user.toMap());
    return res;
  }

  Future<UserModel?> getLoginUser(String userId, String password) async {
    var dbClient = await db;
    var res = await dbClient.rawQuery("SELECT * FROM $Table_User WHERE "
        "$C_UserID = '$userId' AND "
        "$C_Password = '$password'");

    if (res.length > 0) {
      return UserModel.fromMap(res.first);
    }

    return null;
  }

  Future<int> updateUser(UserModel user) async {
    var dbClient = await db;
    var res = await dbClient.update(Table_User, user.toMap(),
        where: '$C_UserID = ?', whereArgs: [user.user_id]);
    return res;
  }

  Future<int> deleteUser(String user_id) async {
    var dbClient = await db;
    var res = await dbClient
        .delete(Table_User, where: '$C_UserID = ?', whereArgs: [user_id]);
    return res;
  }
}

'这是我在databasehelper中使用的代码,它显示了如下的error in_database:必须初始化不可为null的变量"_db"。请尝试添加初始值设定项表达式
enter image description here
有人能帮我解决这个问题吗,谢谢

vshtjzan

vshtjzan1#

这里有一个静态变量

static Database _db;

它的类型是Database,所以不能为null,但是你只能用initDb()给它赋值,initDb()是在你的初始化器之后调用的,这对编译器来说太晚了,所以它抛出一个错误。
所以你能做的就是让这个变量可以为空。
将上面的行更改为

static Database? _db;

那么您的if (_db != null)行也会有意义,因为它检查空性,这在以前是不可能的
您还可以调整其他方法来处理此更改

Future<Database> get db async {
    if (_db != null) {
      return _db!; // ! force-unwraps the optional
    }
    _db = await initDb();
    return _db!; // ! force-unwraps the optional. This assumes your initDb() always returns an actual value
  }

相关问题