使用sqlcipher数据库进行插入或更新需要很长时间才能完成

时间:2018-09-25 02:01:29

标签: database sqlcipher-android

早上好,我想弄清楚如何在不存在的情况下插入行,或者更新现有行...

场景

我的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()方法不能解决我的问题。

0 个答案:

没有答案