Добрый день, я пытаюсь выяснить, как вставить строку, если она не существует, или обновить существующую строку ...
Сценарий
Мой 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 () не является решением моей проблемы.