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

Flutter中SQFLite数据更新无响应,求数据库/控制器/首页实现代码

你的代码存在几个核心问题导致更新无反应:SQL语句残缺、参数传递不足、异步逻辑未处理、控制器调用错误。以下是各层的具体修改方案:

一、数据库层(DBCari)修改

原update方法的SQL语句既没有赋值也没有指定更新条件,且参数无法定位唯一记录。修改为带占位符的完整SQL,同时补充主键和新值参数:

static Future<int?> update(int cariId, String newCariAdi) async {
  var dbClient = await _db;
  // 用占位符传递参数,通过主键定位要更新的记录
  return await dbClient?.rawUpdate(
    'UPDATE $_tableName SET cariadi = ? WHERE id = ?',
    [newCariAdi, cariId],
  );
}

注:如果你的Cari表主键不是id,替换为实际的唯一标识字段。

二、CariController控制器修改

用GetX的可观察列表管理数据,完善异步逻辑,确保数据库更新完成后再刷新列表:

class CariController extends GetxController {
  // 用RxList实现数据变化时UI自动刷新
  final RxList<Cari> cariList = <Cari>[].obs;

  @override
  void onInit() {
    super.onInit();
    // 初始化时加载数据
    getCari();
  }

  Future<void> getCari() async {
    List<Map<String, dynamic>> cariler = await DBCari.query();
    cariList.assignAll(cariler.map((data) => Cari.fromJson(data)).toList());
  }

  Future<void> updateData(int cariId, String newCariAdi) async {
    // 等待数据库更新完成
    await DBCari.update(cariId, newCariAdi);
    // 重新加载数据刷新列表
    await getCari();
  }
}
三、首页(UI层)修改

确保获取待编辑的Cari对象和新输入值,在点击事件中调用控制器的业务更新方法,同时用Obx包裹列表实现自动刷新:

// 声明变量存储选中的待编辑对象和输入控制器
Cari? selectedCari;
final TextEditingController _editController = TextEditingController();

// 列表UI(用Obx包裹)
Obx(
  () => ListView.builder(
    itemCount: _cariController.cariList.length,
    itemBuilder: (context, index) {
      final cari = _cariController.cariList[index];
      return ListTile(
        title: Text(cari.cariadi!),
        trailing: IconButton(
          icon: const Icon(Icons.edit),
          onTap: () {
            // 选中当前要编辑的记录
            selectedCari = cari;
            // 弹出编辑弹窗
            _showEditDialog();
          },
        ),
      );
    },
  ),
)

// 编辑弹窗实现
void _showEditDialog() async {
  if (selectedCari == null) return;
  _editController.text = selectedCari!.cariadi!;
  
  await Get.dialog(
    AlertDialog(
      title: const Text('修改名称'),
      content: TextField(
        controller: _editController,
        decoration: const InputDecoration(hintText: '输入新名称'),
      ),
      actions: [
        TextButton(
          onPressed: () => Get.back(),
          child: const Text('取消'),
        ),
        TextButton(
          onPressed: () async {
            final newName = _editController.text.trim();
            if (newName.isNotEmpty) {
              // 调用控制器的更新方法
              await _cariController.updateData(selectedCari!.id!, newName);
              Get.back();
              _editController.clear();
            }
          },
          child: const Text('确认'),
        ),
      ],
    ),
  );
}

内容的提问来源于stack exchange,提问作者ckot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:21:01