Sqflite中NoSuchMethodError求助:insert方法参数不匹配
解决sqflite的NoSuchMethodError问题
错误根源
- 表名参数错误:调用
insert/update/delete时,你传入了数据库文件名notes.db作为第一个参数,但sqflite要求该参数是数据库表名(你的表名是notes),参数不匹配直接触发NoSuchMethodError。 - 数据库初始化逻辑缺陷:
dbInit中的database是局部变量,无法实现单例,每次调用都会重新打开数据库连接,可能引发额外异常。
修复方案
1. 修正数据库操作的表名参数
所有数据库操作方法的第一个参数替换为表名notes,而非数据库文件名。
2. 修复数据库初始化的单例逻辑
使用静态成员变量保存数据库实例,确保只初始化一次。
修复后的完整代码
import 'package:sqflite/sqflite.dart'; import 'dart:async'; import 'package:path/path.dart'; import '../models/notemodel.dart'; class DataBaseHelper { static const dbname = 'notes.db'; static const dbversion = 1; // 静态变量保存数据库实例,实现单例 static Database? _database; Future<Database> dbInit() async { if (_database != null) { return _database!; } else { _database = await openDatabase( join( await getDatabasesPath(), dbname, ), onCreate: onCreate, version: dbversion, ); return _database!; } } void onCreate(Database db, int version) { db.execute( 'CREATE TABLE notes(id INTEGER PRIMARY KEY,title TEXT,description TEXT,date DATE)', ); } // insert notes Future<void> insertNotes(Note note) async { final db = await dbInit(); await db.insert( 'notes', // 替换为表名 note.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); } // retrieve notes Future<List<Note>> getNote() async { final db = await dbInit(); final List<Map<String, dynamic>> maps = await db.query('notes'); return List.generate(maps.length, (index) { return Note( id: maps[index]['id'], title: maps[index]['title'], description: maps[index]['description'], date: maps[index]['date'], ); }); } // edit note Future<void> editNote(Note note) async { final db = await dbInit(); await db.update( 'notes', // 替换为表名 note.toMap(), where: 'id=?', whereArgs: [note.id], ); } // delete note Future<void> deleteNote(int id) async { final db = await dbInit(); await db.delete( 'notes', // 替换为表名 where: 'id=?', whereArgs: [id], ); } }
关键修改点说明
- 将局部变量
database改为静态_database,确保数据库实例唯一,避免重复初始化连接。 - 所有
insert/update/delete方法的第一个参数从notes.db改为表名notes,匹配sqflite方法的参数要求。 - 修正
onCreate方法的返回值逻辑,原代码存在返回Future但方法未声明async的矛盾,改为直接执行db.execute。
内容的提问来源于stack exchange,提问作者Abhirag Pn
相关产品推荐
相关产品推荐

