早上好,我想弄清楚如何在不存在的情况下插入行,或者更新现有行...
场景
我的android项目从Web服务器获取数据并将其存储到JSONArray,并执行循环以插入行或更新(如果存在于本地数据库中)。在项目开始时,我的表中只有200行,我的应用程序运行良好,但是现在我的表中有1000行,这使我的应用程序每次都冻结。它需要1分钟才能完成任务,因此我的GUI也在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方法是删除行而不是更新行,因为我有要保留的列,我认为replace()方法不能解决我的问题。