You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:07:05