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

问题描述 投票:0回答:2

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

    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);
  }
}
dart flutter
2个回答
0
投票

我给出了第一个答案,建议只在需要时才使用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行,结果很棒。调用1000次时db.insert需要7秒,而batch.insert在插入相同数量的数据时花费不到1秒。

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


1
投票
  1. 您正在使用await关键字从SQLite获取数据。
  2. 你正在获取大量数据。
  3. 这将使数据获取同步,并将影响您的UI。
  4. 如果您的用例可以方便地异步获取数据,那么您可以使用以下方法:

变化:

await Helper().insert(token);
Navigator.push(
    context,MaterialPageRoute(builder: (context) => ListPage(model.data.token)));

至 :

Helper().insert(token).then((onValue) {
      Navigator.push(context,MaterialPageRoute(
        builder: (context) => ListPage(model.data.token),
      ),
    );
}

注意:让你的insert方法返回Future<'token's return type'>

现在以这种方式用于所有其他await调用。

© www.soinside.com 2019 - 2024. All rights reserved.