我将所有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);
}
}
我给出了第一个答案,建议只在需要时才使用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上遇到任何问题。如果这有帮助,请告诉我。
await
关键字从SQLite获取数据。变化:
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
调用。