Вставка или обновление с использованием базы данных sqlcipher занимает много времени, чтобы закончить - PullRequest
0 голосов
/ 25 сентября 2018

Добрый день, я пытаюсь выяснить, как вставить строку, если она не существует, или обновить существующую строку ...

Сценарий

Мой Android-проект извлекает данные с веб-сервера и сохраняет их в JSONArray и выполняет цикл для вставки строки или обновления, если они существуют, в мою локальную базу данных.В начале моего проекта у меня было только 200 строк в моей таблице, и мое приложение работало хорошо, но теперь моя таблица имеет 1000 строк, что заставляет мое приложение каждый раз зависать.Выполнение задачи занимает 1 минуту, поэтому мой графический интерфейс также зависает через 1 минуту.Ожидание 1 минуты очень раздражает пользователей ...

вот мой код

 public ArrayList<HashMap<String,Object>> updateDatabase(JSONArray list) {
        ArrayList<HashMap<String, Object>> mylist = new ArrayList<>();

       for (int i = 0; i<list.length(); i++) {
           try {
               JSONObject object = list.getJSONObject(i);

               String id = object.getString("_id");
               String title = object.getString("title");
               String artist = object.getString("artist");
               String lyrics = object.getString("lyrics");
               String genre = object.getString("genre");
               String video_url = object.getString("video_url");
               String youtubeID = object.getString("youtubeID");
               String media_extension = object.getString("media_extension");

                       ContentValues cv = new ContentValues();
                       cv.put("_id", id);
                       cv.put("title",title);
                       cv.put("artist", artist);
                       cv.put("lyrics", lyrics);
                       cv.put("genre", genre);
                       cv.put("video_url", video_url);
                       cv.put("youtubeID", youtubeID);
                        cv.put("media_extension", media_extension);

                        SQLiteDatabase db = openHelper.getWritableDatabase(p);

                       Cursor cursor = db.query("minus_one_and_lyrics",null,"title = ? and artist = ? or _id = ?",new String[]{title,artist, id},null,null,null);

                       if (cursor.moveToFirst()) {
                           db.update("minus_one_and_lyrics",cv,"_id = ?",new String[]{id});
                       }else {
                           cv.put("New",1);
                          long ins =  db.insert("minus_one_and_lyrics",null, cv);
                           if (ins > -1) {
                               HashMap<String,Object> data = new HashMap<>();
                               data.put("note","New Song Added");
                               data.put("title",title);
                               data.put("id", id);
                               data.put("artist", artist);
                               data.put("lyrics", lyrics);
                               data.put("genre", genre);
                               data.put("video_url", video_url);
                               data.put("youtubeID", youtubeID);
                               data.put("media_extension", media_extension);
                               mylist.add(data);
                           }
                       }
               db.close();
           } catch (JSONException e) {
               e.printStackTrace();
           }

          Log.d("TAGs", "Updating Database "+ i);

       }
       return mylist;
    }

Основываясь на моих исследованиях, открытие и закрытие базы данных много раз будетснизить производительность приложения.Я говорю о цикле

SQLiteDatabase db = openHelper.getWritableDatabase (p);

и

db.close ();

1000 раз сократит время загрузки приложения, но когда я попытался переместить открытие и закрытие за пределы цикла, приложение было немедленно остановлено.

Мои вопросы:Есть ли способ уменьшить задачу запросов?или можно сделать вставку или обновление в один запрос вместо 1000 циклов?

Я также попробовал метод db.replace (), и он сократит время загрузки, но проблема в том, что метод замены состоит в том, чтобы удалить строку, а не обновлять строку, так как у меня есть столбец, который я хочу сохранитьЯ думаю, что метод replace () не является решением моей проблемы.

...