我将所有 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/