dart - 如何解决使用异步和等待使用 Sqflite 进行缓存时的缓慢问题?

标签 dart flutter

我将所有 API 数据存储到缓存中。一些 API 有超过 10000 个数据。 postman 响应时间在一秒内。但在应用程序中导航到下一页非常慢。我使用了这段代码:

    onPressed: () async {
    ...
    }   
     else {
var token = Token(
                                      id: 1,
                                      token: tokens,
                                      refreshToken: model.data.refreshToken,
                                    );
                                     await storeRegister(_url,tokens);
                                     await storeEquipmentReg(_url,tokens);
                                     await storeSyncLogin(_url,tokens);
                                     await HelperDefCatMaster().deleteDefCatMaster();
                                     await storeDefCatMaster(_url,tokens);
                                     await HelperDefRegisterCat().deleteDefRegisterCat();
                                     await storeDefRegisterCat(_url,tokens);
                                     await HelperDefCatMaster().deleteDefCatRelation();
                                     await storeDefCatRelation(_url,tokens);
                                     await HelperDefCatMaster().deleteWoDescription();
                                      await storeWoDescription(_url,tokens);
                                     await HelperDefCatMaster().deleteCategoryDefect();
                                     await storeCategoryDefect(_url,tokens);
                                     await storeWorkSource(_url,tokens);
                                     await storeWorkTypes(_url,tokens);
                                     await storePriorities(_url,tokens);
                                    await Helper().insert(token);
                                    Navigator.push(
                                        context,
                                        MaterialPageRoute(
                                            builder: (context) => ListPage(model.data.token)));
                                  }

storePriorities 函数看起来像,

storePriorities(String url, String token) async {
  final response = await http.get(
    '${url}/v1.0/Priorities',
    headers: {'Authorization': 'Bearer ${token}'},
  );
  final jsonResponse = json.decode(response.body);
  Priorities model = Priorities.fromJson(jsonResponse);
  int length = model.data.length;
  for (int i = 0; i < length; i++) {
    var data = DataPriorities(
      i: model.data[i].i,
      d: model.data[i].d,
    );
    await HelperDefCatMaster().insertPriorities(data);
  }
}

最佳答案

我给出的第一个答案建议仅在需要时使用 await

好吧,如果你在 SQLite 中插入了太多数据,我假设你可能正在使用这样的东西:

for (int i = 0; i <= 1000; i++) {
  db.insert('table_name', dataObject.toMap());
}

好吧,这会一次处理很多事务,并且会占用您很多时间。

改成这样可以提高插入数据的速度:

Batch batch = db.batch();
for (int i = 0; i <= 1000; i++) {
  batch.insert('table_name', dataObject.toMap());
}
await batch.commit();

我们在这里做的是,在单个事务中,我们一次执行多个插入。

我在一次插入 1000 行的演示项目中进行了此更改,结果非常好。 db.insert 在被调用 1000 次时耗时 7 秒,而 batch.insert 插入相同数量的数据耗时不到 1 秒。

如果您使用此解决方案优化您的代码并在需要时使用等待,您应该不会在 UI 上遇到任何问题。如果这有帮助,请告诉我。

关于dart - 如何解决使用异步和等待使用 Sqflite 进行缓存时的缓慢问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55608496/

相关文章:

android-studio - 无法在android studio中创建flutter项目

flutter - Flutter 有编辑布局的实时预览吗?

android - 使用 flutter 启动时不会传播权限请求,但直接使用 android 启动时会传播

android - 未处理的异常 : MissingPluginException(No implementation found for method scanBarcode on channel flutter_barcode_scanner)

dart - 如何修复 FutureBuilder 打开多次错误?

dart - 如何在 Dart 中模拟 protected 方法?

flutter - Flutter 中的 new_version 包返回 RangeError (index) : Invalid value: Valid value range is empty: 1

android - 如何用提供者的值(value)更新其他页面?

flutter - 如何在整个页面中快速监听单击事件

flutter - 我可以在flutter的** noSuchMethod()**内部使用什么参数来处理空快照数据?