【问题标题】:sqflite - The method 'insert' was called on nullsqflite - 在 null 上调用了方法“插入”
【发布时间】:2021-08-21 15:51:31
【问题描述】:

我正在尝试使用在我的数据库类中创建的插入函数,但它只返回以下错误“NoSuchMethodError:方法 'insert' 在 null 上被调用。”我不知道为什么,我正在关注 Youtube 上的成长开发者的教程,但他似乎没有遇到这个问题。

database_helper.dart

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

class DatabaseHelper {

  static final _dbName = 'poi_database.db';
  static final _dbVersion = 1;
  static final _tableName = 'poi';

  static final cnameId = 'id';
  static final cnameVillage = 'village';
  static final cnameLieu = 'lieu';
  static final cnameType = 'type';
  static final cnameEtat = 'etat';
  static final cnameNotes = 'notes';
  static final cnameLatitude = 'latitude';
  static final cnameLongitude = 'longitude';
  static final cnameImageUrl = 'image_url';

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

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

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

  Future _onCreate(Database db, int version) async {
    db.execute(
      '''
      CREATE TABLE $_tableName(
      $cnameId INTEGER PRIMARY KEY,
      $cnameVillage TEXT NOT NULL,
      $cnameLieu TEXT NOT NULL,
      $cnameType TEXT NOT NULL,
      $cnameEtat TEXT NOT NULL,
      $cnameNotes TEXT NOT NULL,
      $cnameLatitude TEXT NOT NULL,
      $cnameLongitude TEXT NOT NULL,
      $cnameImageUrl TEXT)
      '''
    );
  }

  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[cnameId];
    return await db.update(_tableName, row, where:'$cnameId = ?', whereArgs: [id]);
  }

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

}

我尝试使用它的地方:

                  int i = await DatabaseHelper.instance.insert({
                    DatabaseHelper.cnameVillage : _village,
                    DatabaseHelper.cnameLieu : _lieu,
                    DatabaseHelper.cnameType : _type,
                    DatabaseHelper.cnameEtat : _etatSelect,
                    DatabaseHelper.cnameNotes : _notes,
                    DatabaseHelper.cnameLatitude : markerLat,
                    DatabaseHelper.cnameLongitude : markerLong,
                    DatabaseHelper.cnameImageUrl : '',
                  });

提前致谢!

【问题讨论】:

    标签: database flutter mobile sqflite


    【解决方案1】:

    您似乎没有在初始化数据库。你在哪里调用 getDatabase?

    【讨论】:

    • 我不是。我应该在这个屏幕上初始化它吗?我该怎么做?
    • 只需在你的 initState() 中调用 getDatabase
    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 2020-02-21
    • 1970-01-01
    • 2020-08-29
    • 2021-02-11
    • 2021-01-19
    • 2019-09-12
    相关资源
    最近更新 更多