Flutter中SQLite删除数据异常:id引用返回null且删除无生效
Flutter SQLite 删除数据失败(返回0)& id为null问题排查与解决
核心问题分析
- 调用
deleteBook时传入的id为null,导致删除条件id = ?匹配不到任何数据,方法返回0(无数据被删除) Book类中id定义为可空类型int?,但数据表books的id是INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,若插入数据后未将数据库生成的自增id赋值给Book对象,会导致Book实例的id始终为null
具体解决方案
1. 确保传入deleteBook的id非空且有效
- 调用删除方法前必须校验id,避免传入null:
if (targetBook.id != null) { await deleteBook(targetBook.id!); } else { print("删除失败:Book的id为空"); } - 修正插入数据的逻辑,将数据库返回的自增id赋值给
Book对象:
调用插入后更新Future<int> insertBook(Book book) async { final db = await database; // insert方法返回新插入行的自增id final generatedId = await db.insert('books', book.toMap()); return generatedId; }Book实例:final newBook = Book(title: "Flutter入门", description: "基础教程", author: "XXX"); final bookId = await insertBook(newBook); // 创建带有效id的Book实例 final savedBook = Book(id: bookId, title: newBook.title, description: newBook.description, author: newBook.author);
2. 优化deleteBook方法,规避空值问题
- 将参数改为非空
int,编译阶段拦截空值传入,同时返回删除行数便于调试:Future<int> deleteBook(int id) async { final db = await database; print('执行删除:DELETE FROM books WHERE id = $id'); final rowsDeleted = await db.delete( 'books', where: 'id = ?', whereArgs: [id], ); print('成功删除$rowsDeleted条数据'); return rowsDeleted; }
3. 确认数据表结构正确性
- 检查建表SQL是否符合预期,确保
id是自增主键:
若表结构有误,需重新创建表(注意提前备份数据)。CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title TEXT NOT NULL, description TEXT NOT NULL, author TEXT NOT NULL );
4. 调试辅助技巧
- 打印
Book实例详情,确认id是否存在:print("待删除Book信息:id=${targetBook.id}, title=${targetBook.title}"); - 使用
rawDelete直接执行SQL测试,验证删除逻辑:final testId = 1; // 替换为数据表中实际存在的id final rows = await db.rawDelete('DELETE FROM books WHERE id = ?', [testId]); print('rawDelete执行结果:删除了$rows条数据');
内容的提问来源于stack exchange,提问作者kemper_969
相关产品推荐
相关产品推荐

