Как исправить медленную проблему при использовании асинхронности и ожидании кэширования с помощью Sqflite?

Я храню все данные 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);
  }
}

Что такое HelperDefCatMaster?

dubace 11.04.2019 14:48

это помощник базы данных. создать базу данных и создать таблицы и отображать значения

user11065582 12.04.2019 06:37
0
2
1 586
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Вы используете ключевое слово await для извлечения данных из SQLite.
  2. И вы получаете много данных.
  3. Это сделает выборку данных синхронной и повлияет на ваш пользовательский интерфейс.
  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.

как эти вещи: await storeWoDescription(_url,tokens); await HelperDefCatMaster().deleteCategoryDefect(); await storeCategoryDefect(_url,tokens); Navigator.pop(context); Navigator.push( context, MaterialPageRoute( builder: (context) => ListPage(model.data.token)));

user11065582 12.04.2019 06:22

как использовать все остальные вызовы ожидания?

user11065582 12.04.2019 06:28

Главное - не использовать await, когда вы не хотите выполнять синхронную операцию. Все ли вызовы await необходимо выполнять по порядку??

Kalpesh Kundanani 12.04.2019 06:32

нет, но данные отсутствуют при переходе на следующую страницу.

user11065582 12.04.2019 06:35

после перехода на следующую страницу и ожидания 10 минут приходят данные

user11065582 12.04.2019 06:41

Я показал индикатор выполнения. но вы знаете, что клиент не любит ждать 10 минут

user11065582 12.04.2019 06:42

Если вам требуется 10 минут для завершения процесса, вы можете изменить свой подход к сохранению данных. Одна вещь, которую вы можете сделать, это создать класс репозитория и сохранить данные в переменных, перейти на следующую страницу и прочитать данные из этих переменные. и в фоновом режиме синхронизировать эти данные с базой данных. Я надеюсь, что я ясно .. если нет, то, пожалуйста, дайте мне знать ..

Kalpesh Kundanani 12.04.2019 07:00
Ответ принят как подходящий

Я дал первый ответ, который предлагает использовать 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 секунд, тогда как для вставки того же объема данных для пакетного.insert потребовалось менее 1 секунды.

Если вы оптимизируете свой код с помощью этого решения и используете ожидание, когда это необходимо, вы не должны столкнуться с какими-либо проблемами в пользовательском интерфейсе. Позвольте мне знать, если это помогает.

вау.. работает хорошо. после проверки QA я сообщу вам фактический результат

user11065582 16.04.2019 06:02

@kapesh, могу ли я использовать транзакцию для получения данных? Я имею в виду, будет ли это более быстрой операцией?

Achin 20.09.2020 08:37

Другие вопросы по теме