java - android解析json,删除和插入值到数据库

标签 java android json sqlite

我正在尝试通过调用我在数据库类中创建的删除和插入方法来更新值。然而,这确实如我所料。每当调用 delete 方法的 Activity 将被执行并给出空值时,当第二次再次调用该 Activity 时,它将具有值(我使用 toast 文本获取值并用 try 和 catch 包围它,这将给出异常无效索引#(数组列表索引为零,直到最后一个索引)大小为零)。但是我正在使用 asynctask 执行此任务,这是我尝试执行的操作:

@Override
        protected Void doInBackground(Void... arg0) {
            databaseMaster2=new DatabaseMaster2(MainActivity.this);            
            databaseMaster2.getWritableDatabase();
            ServiceHandler sh = new ServiceHandler();
            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
            jsonStr = jsonStr.replace(
                    "<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
            jsonStr = jsonStr.replace("<string>", "");
            jsonStr = jsonStr.replace("</string>", "");
            // Log.d("Response: ", "> " + jsonStr);
            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);
                    // Getting JSON Array node
                    Erates = jsonObj.getJSONArray(TAG_Erate);
                    Arates = jsonObj.getJSONArray(TAG_Arate);
                    Kondisis = jsonObj.getJSONArray(TAG_kondisi);
                    Zonas = jsonObj.getJSONArray(TAG_Zona);
                    tipeASs = jsonObj.getJSONArray(TAG_tipeAs);
                    // looping through All rates
                    for (int i = 0; i < Erates.length(); i++) {
                        JSONObject c = Erates.getJSONObject(i);
                        int id = c.getInt(TAG_ER_ID);
                        int tenor = c.getInt(TAG_ER_TENOR);
                        String ko = c.getString(TAG_ER_K);
                        String co = c.getString(TAG_ER_C);
                        double rate = c.getDouble(TAG_ER_RATE);
                        double ratedb = c.getDouble(TAG_ER_RATE_DB);
                        databaseMaster2.checkErates(id, tenor, ko, co, rate, ratedb);
                        if(databaseMaster2.checkErates(id, tenor, ko, co, rate, ratedb) == true){
                            databaseMaster2.deleteEntryEffectiveRate(id);                           
                            //databaseMaster2.saveEntryEffectiveRate(id, tenor,ko,co,
                                //   rate,ratedb);
                        }
                        else {
                       databaseMaster2.saveEntryEffectiveRate(id, tenor,ko,co,rate,ratedb);
                            //databaseMaster2.deleteEntryAsuransiRate(id);
                        }                   
                    }
                    for (int i = 0; i < Arates.length(); i++) {
                        JSONObject c = Arates.getJSONObject(i);
                        int id = c.getInt(TAG_AS_ID);
                        int zona = c.getInt(TAG_AS_Z);
                        int tenor = c.getInt(TAG_AS_T);
                        double tlo = c.getDouble(TAG_AS_TLO);
                        double comp = c.getDouble(TAG_AS_Comp);
                        double comb = c.getDouble(TAG_AS_comb);
                        // Log.d("Response test: ", id + "\n" + zona + "\n"
                        // + tenor + "\n" + tlo + "\n" + comp + "\n"
                        // + comb);
                        databaseMaster2.checkArates(id, zona, tenor, tlo, comp, comb);
                        if(databaseMaster2.checkArates(id, zona, tenor, tlo, comp, comb) == true){
                            databaseMaster2.deleteEntryAsuransiRate(id);                            
                        }
                        else {
                       databaseMaster2.saveEntryAsuransiRate(id, zona, tenor, tlo, comp, comb);                 
                        }   
                    }
                    for (int i = 0; i < Kondisis.length(); i++) {
                        JSONObject c = Kondisis.getJSONObject(i);
                        int id = 0;
                        String ko = c.getString(TAG_K);
                        String co = c.getString(TAG_C);
                        // Log.d("Response test1: ", ko + "\n" + co);
                        databaseMaster2.checkKondisi(ko, co);
                        if(databaseMaster2.checkKondisi(ko,co) == true){
                            databaseMaster2.deleteKondisi(id);                          
                        }
                        else {
                       databaseMaster2.saveKondisi(ko, co);                         
                        }                                               
                    }
                    for (int i = 0; i < Zonas.length(); i++) {
                        JSONObject c = Zonas.getJSONObject(i);
                        int id = 0;
                        String Za = c.getString(TAG_Za);
                        String Ze = c.getString(TAG_Ze);
                        // Log.d("Response test1: ", Za + "\n" + Ze);
                        databaseMaster2.checkZona(Za, Ze);
                        if(databaseMaster2.checkZona(Za, Ze) == true){
                            databaseMaster2.deleteZona(id);                         
                        }
                        else {
                       databaseMaster2.saveZona(Za, Ze);                    
                        }                                       
                    }
                    for (int i = 0; i < tipeASs.length(); i++) {
                        JSONObject c = tipeASs.getJSONObject(i);
                        int id = 0;
                        String Ty = c.getString(TAG_Ty);
                        // Log.d("Response test1: ", Ty);
                        databaseMaster2.checkType(Ty);
                        if(databaseMaster2.checkType(Ty) == true){
                            databaseMaster2.deleteType(id); 
                        }
                        else {
                       databaseMaster2.saveTipeAsuransi(Ty);

                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }
            return null;
        }

我从数据库类(命名为 DatabaseMaster2)中使用的方法: 示例:

public void deleteEntryEffectiveRate(long er_id) throws SQLException{
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_EFFECTIVE_RATE, KEY_ER_ID + " = ?",
                new String[] { String.valueOf(er_id) });
    }
    public void saveEntryEffectiveRate(int id, int tenor,String ko,String co, double rate,
            double ratedb) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues valuesER = new ContentValues();
        valuesER.put(KEY_ER_ID, id);
        valuesER.put(KEY_ER_TENOR, tenor);
        valuesER.put(KEY_ER_KO, ko);
        valuesER.put(KEY_ER_CO, co);
        valuesER.put(KEY_ER_RATE, rate);
        valuesER.put(KEY_ER_RATE_DB, ratedb);
        db.insert(TABLE_EFFECTIVE_RATE, null, valuesER);
    }

并在这里调用它:

for (int i = 0; i < Erates.length(); i++) {
JSONObject c = Erates.getJSONObject(i);
    int id = c.getInt(TAG_ER_ID);
    int tenor = c.getInt(TAG_ER_TENOR);
    String ko = c.getString(TAG_ER_K);
    String co = c.getString(TAG_ER_C);
    double rate = c.getDouble(TAG_ER_RATE);
    double ratedb = c.getDouble(TAG_ER_RATE_DB);
    databaseMaster2.checkErates(id, tenor, ko, co, rate, ratedb);
        if(databaseMaster2.checkErates(id, tenor, ko, co, rate, ratedb) == true){
            databaseMaster2.deleteEntryEffectiveRate(id);
            }
            else {
               databaseMaster2.saveEntryEffectiveRate(id, tenor,ko,co,rate,ratedb);
                        }   
                    }

然后检查该行是否为空:

public boolean checkErates(int id, int tenor,String ko,String co, double rate,
            double ratedb) 
    {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_EFFECTIVE_RATE, 
                new String[] { KEY_ER_ID,KEY_ER_KO,KEY_ER_CO,KEY_ER_RATE,KEY_ER_RATE_DB }, 
                KEY_ER_ID + " = ? and " + KEY_ER_TENOR + " = ? and "+ KEY_ER_KO + " = ? and " + KEY_ER_CO + " = ? and " + KEY_ER_RATE + " = ? and " + KEY_ER_RATE_DB + " = ?" , 
                new String[] {String.valueOf(id),String.valueOf(tenor),ko,co,String.valueOf(rate),String.valueOf(ratedb)}, 
                null, null, null, null);

        if(cursor.moveToFirst()){

         return true; 
         }//row exists
        else {
         return false;
        }


    }

第二个问题的 Logcat:

04-27 09:57:30.280: E/Database(1018): close() was never explicitly called on database '/data/data/www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom/databases/Rates' 
04-27 09:57:30.280: E/Database(1018): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
04-27 09:57:30.280: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1827)
04-27 09:57:30.280: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
04-27 09:57:30.280: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
04-27 09:57:30.280: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
04-27 09:57:30.280: E/Database(1018):   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:541)
04-27 09:57:30.280: E/Database(1018):   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
04-27 09:57:30.280: E/Database(1018):   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
04-27 09:57:30.280: E/Database(1018):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:530)
04-27 09:57:30.280: E/Database(1018):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:1)
04-27 09:57:30.280: E/Database(1018):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-27 09:57:30.280: E/Database(1018):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-27 09:57:30.280: E/Database(1018):   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-27 09:57:30.280: E/Database(1018):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-27 09:57:30.280: E/Database(1018):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-27 09:57:30.280: E/Database(1018):   at java.lang.Thread.run(Thread.java:1019)
04-27 09:57:30.310: E/Database(1018): close() was never explicitly called on database '/data/data/www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom/databases/Rates' 
04-27 09:57:30.310: E/Database(1018): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
04-27 09:57:30.310: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1827)
04-27 09:57:30.310: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
04-27 09:57:30.310: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
04-27 09:57:30.310: E/Database(1018):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
04-27 09:57:30.310: E/Database(1018):   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:541)
04-27 09:57:30.310: E/Database(1018):   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
04-27 09:57:30.310: E/Database(1018):   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
04-27 09:57:30.310: E/Database(1018):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:530)
04-27 09:57:30.310: E/Database(1018):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:1)
04-27 09:57:30.310: E/Database(1018):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-27 09:57:30.310: E/Database(1018):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-27 09:57:30.310: E/Database(1018):   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-27 09:57:30.310: E/Database(1018):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-27 09:57:30.310: E/Database(1018):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-27 09:57:30.310: E/Database(1018):   at java.lang.Thread.run(Thread.java:1019)

然后在我输入 DatabaseMaster2.closeDB(); 之后 closedb 方法:

public void closeDB() {
        SQLiteDatabase db = this.getReadableDatabase();
        if (db != null && db.isOpen())
            db.close();
    }

logcat 改变了:

04-27 11:07:51.170: D/dalvikvm(1604): GC_EXTERNAL_ALLOC freed 68K, 52% free 2624K/5379K, external 1625K/2137K, paused 64ms
    04-27 11:07:56.670: D/dalvikvm(1604): GC_EXTERNAL_ALLOC freed 6K, 51% free 2641K/5379K, external 10738K/10738K, paused 43ms
    04-27 11:08:00.120: W/dalvikvm(1604): threadid=9: thread exiting with uncaught exception (group=0x40015560)
    04-27 11:08:00.140: E/AndroidRuntime(1604): FATAL EXCEPTION: AsyncTask #1
    04-27 11:08:00.140: E/AndroidRuntime(1604): java.lang.RuntimeException: An error occured while executing doInBackground()
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.lang.Thread.run(Thread.java:1019)
    04-27 11:08:00.140: E/AndroidRuntime(1604): Caused by: java.lang.NullPointerException
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.DatabaseMaster2.close(DatabaseMaster2.java:473)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:591)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:1)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
    04-27 11:08:00.140: E/AndroidRuntime(1604):     ... 4 more
    04-27 11:08:03.281: E/WindowManager(1604): Activity www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4050a8e8 that was originally added here
    04-27 11:08:03.281: E/WindowManager(1604): android.view.WindowLeaked: Activity www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4050a8e8 that was originally added here
    04-27 11:08:03.281: E/WindowManager(1604):  at android.view.ViewRoot.<init>(ViewRoot.java:258)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.view.Window$LocalWindowManager.addView(Window.java:424)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.Dialog.show(Dialog.java:241)
    04-27 11:08:03.281: E/WindowManager(1604):  at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.onPreExecute(MainActivity.java:447)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.os.AsyncTask.execute(AsyncTask.java:391)
    04-27 11:08:03.281: E/WindowManager(1604):  at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity.onCreate(MainActivity.java:201)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.os.Handler.dispatchMessage(Handler.java:99)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.os.Looper.loop(Looper.java:123)
    04-27 11:08:03.281: E/WindowManager(1604):  at android.app.ActivityThread.main(ActivityThread.java:3647)
    04-27 11:08:03.281: E/WindowManager(1604):  at java.lang.reflect.Method.invokeNative(Native Method)
    04-27 11:08:03.281: E/WindowManager(1604):  at java.lang.reflect.Method.invoke(Method.java:507)
    04-27 11:08:03.281: E/WindowManager(1604):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    04-27 11:08:03.281: E/WindowManager(1604):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    04-27 11:08:03.281: E/WindowManager(1604):  at dalvik.system.NativeStart.main(Native Method)
    04-27 11:08:06.130: I/Process(1604): Sending signal. PID: 1604 SIG: 9

我把 closeDB(); 放在这里:(在一个 for 循环上然后在所有 for 循环上,logcat 是相同的)

for (int i = 0; i < Erates.length(); i++) {
JSONObject c = Erates.getJSONObject(i);
    int id = c.getInt(TAG_ER_ID);
    int tenor = c.getInt(TAG_ER_TENOR);
    String ko = c.getString(TAG_ER_K);
    String co = c.getString(TAG_ER_C);
    double rate = c.getDouble(TAG_ER_RATE);
    double ratedb = c.getDouble(TAG_ER_RATE_DB);
    databaseMaster2.checkErates(id, tenor, ko, co, rate, ratedb);
        if(databaseMaster2.checkErates(id, tenor, ko, co, rate, ratedb) == true){
            databaseMaster2.deleteEntryEffectiveRate(id);
            }
            else {
                       databaseMaster2.saveEntryEffectiveRate(id, tenor,ko,co,rate,ratedb);
                        }
                        databaseMaster2.closeDB();
                    }

问题:

  1. 当 Activity 被调用时,它将从行中删除值,然后当它被第二次调用时,它将插入值。有什么建议/想法吗?
  2. 在我多次运行并重新运行该应用程序后,它会导致内存泄漏,并表示数据库从未关闭。 closeDB();Close(); 应该放在哪里?

注意:解析 JSON 工作得很好。如果你问我确定吗,答案是肯定的。证明 here

更新问题 1:删除和插入也能正常工作,我想做的是如果行为空则删除然后插入,否则它会插入(如果它已经为空)。但它恰好在第一个 Activity 中删除然后调用给出空值,当我关闭 Activity 并再次调用它时,它将运行将插入数据的 else 条件。问题是,如果用户运行应用程序两次,值就会存在,如果用户只运行 1 次,则没有值。

更新问题 2:尝试根据答案执行此操作:

for (int i = 0; i < Erates.length(); i++) {
                        JSONObject c = Erates.getJSONObject(i);
                        int id = c.getInt(TAG_ER_ID);
                        int tenor = c.getInt(TAG_ER_TENOR);
                        String ko = c.getString(TAG_ER_K);
                        String co = c.getString(TAG_ER_C);
                        double rate = c.getDouble(TAG_ER_RATE);
                        double ratedb = c.getDouble(TAG_ER_RATE_DB);
                        boolean boolCheckErates = databaseMaster2.checkErates(
                                id, tenor, ko, co, rate, ratedb);
                        // close connection here
                        databaseMaster2.closeDB();
                        if (boolCheckErates) {
                            databaseMaster2.deleteEntryEffectiveRate(id);
                            // close connection here
                            databaseMaster2.closeDB();
                        } else {
                            databaseMaster2.saveEntryEffectiveRate(id, tenor,
                                    ko, co, rate, ratedb);
                            // close connection here
                            databaseMaster2.closeDB();
                        }
                    }

多次重新运行应用程序后出现错误:

04-27 10:57:14.000: E/Database(1451): close() was never explicitly called on database '/data/data/www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom/databases/Rates' 
04-27 10:57:14.000: E/Database(1451): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
04-27 10:57:14.000: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1827)
04-27 10:57:14.000: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
04-27 10:57:14.000: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
04-27 10:57:14.000: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
04-27 10:57:14.000: E/Database(1451):   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:541)
04-27 10:57:14.000: E/Database(1451):   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
04-27 10:57:14.000: E/Database(1451):   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
04-27 10:57:14.000: E/Database(1451):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:531)
04-27 10:57:14.000: E/Database(1451):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:1)
04-27 10:57:14.000: E/Database(1451):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-27 10:57:14.000: E/Database(1451):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-27 10:57:14.000: E/Database(1451):   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-27 10:57:14.000: E/Database(1451):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-27 10:57:14.000: E/Database(1451):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-27 10:57:14.000: E/Database(1451):   at java.lang.Thread.run(Thread.java:1019)
04-27 10:57:14.040: E/Database(1451): close() was never explicitly called on database '/data/data/www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom/databases/Rates' 
04-27 10:57:14.040: E/Database(1451): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
04-27 10:57:14.040: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1827)
04-27 10:57:14.040: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
04-27 10:57:14.040: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
04-27 10:57:14.040: E/Database(1451):   at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
04-27 10:57:14.040: E/Database(1451):   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:541)
04-27 10:57:14.040: E/Database(1451):   at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
04-27 10:57:14.040: E/Database(1451):   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
04-27 10:57:14.040: E/Database(1451):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:531)
04-27 10:57:14.040: E/Database(1451):   at www.mandiritunasfinancemobile.co.id.a1s2d3f4g5h6j7k8l9.p0.comcom.MainActivity$GetDatas.doInBackground(MainActivity.java:1)
04-27 10:57:14.040: E/Database(1451):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-27 10:57:14.040: E/Database(1451):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-27 10:57:14.040: E/Database(1451):   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-27 10:57:14.040: E/Database(1451):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-27 10:57:14.040: E/Database(1451):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-27 10:57:14.040: E/Database(1451):   at java.lang.Thread.run(Thread.java:1019)

问题一:我想在else条件之前插入delete之后,可以吗?

更新问题 1 我尝试了这个但失败了

for (int i = 0; i < Erates.length(); i++) {
                        JSONObject c = Erates.getJSONObject(i);
                        int id = c.getInt(TAG_ER_ID);
                        int tenor = c.getInt(TAG_ER_TENOR);
                        String ko = c.getString(TAG_ER_K);
                        String co = c.getString(TAG_ER_C);
                        double rate = c.getDouble(TAG_ER_RATE);
                        double ratedb = c.getDouble(TAG_ER_RATE_DB);
                        boolean boolCheckErates = databaseMaster2.checkErates(
                                id, tenor, ko, co, rate, ratedb);
                        // close connection here
                        databaseMaster2.closeDB();
                        if (boolCheckErates) {
                            databaseMaster2.deleteEntryEffectiveRate(id);
                            // close connection here
                            databaseMaster2.closeDB();

                            databaseMaster2.saveEntryEffectiveRate(id, tenor,
                                    ko, co, rate, ratedb);
                            databaseMaster2.closeDB();
                        } else {
                            databaseMaster2.saveEntryEffectiveRate(id, tenor,
                                    ko, co, rate, ratedb);
                            // close connection here
                            databaseMaster2.closeDB();
                        }
                    }

然后这个:

for (int i = 0; i < Erates.length(); i++) {
                        JSONObject c = Erates.getJSONObject(i);
                        int id = c.getInt(TAG_ER_ID);
                        int tenor = c.getInt(TAG_ER_TENOR);
                        String ko = c.getString(TAG_ER_K);
                        String co = c.getString(TAG_ER_C);
                        double rate = c.getDouble(TAG_ER_RATE);
                        double ratedb = c.getDouble(TAG_ER_RATE_DB);
                        boolean boolCheckErates = databaseMaster2.checkErates(
                                id, tenor, ko, co, rate, ratedb);
                        // close connection here
                        databaseMaster2.closeDB();
                        if (boolCheckErates) {
                            databaseMaster2.deleteEntryEffectiveRate(id);
                            // close connection here
                            databaseMaster2.closeDB();

                            DatabaseMaster2 databaseMaster3 = new DatabaseMaster2(MainActivity.this);
                            databaseMaster3.getWritableDatabase();

                            databaseMaster3.saveEntryEffectiveRate(id, tenor,
                                    ko, co, rate, ratedb);
                            databaseMaster3.closeDB();
                        } else {
                            databaseMaster2.saveEntryEffectiveRate(id, tenor,
                                    ko, co, rate, ratedb);
                            // close connection here
                            databaseMaster2.closeDB();
                        }
                    }

第一次运行很顺利,然后在几次(2-7 次)重新运行后它仍然给出相同的错误,说从未明确调用关闭。知道为什么会在这里发生吗?我只是想避免在真实设备上安装应用程序时应用程序崩溃

最佳答案

因为执行新查询需要正确关闭连接。当前的实现正在尝试执行多个查询。

当前多次调用 checkErates 方法,这不是必需的:

  boolean boolCheckErates=databaseMaster2.checkErates(id, tenor,
                                               ko, co, rate, ratedb);
   // close connection here
      databaseMaster2.closeDB();
  if(boolCheckErates){
        databaseMaster2.deleteEntryEffectiveRate(id);
        // close connection here
        databaseMaster2.closeDB();
   }else{
        databaseMaster2.saveEntryEffectiveRate(id, tenor,ko,co,rate,ratedb);
        // close connection here
        databaseMaster2.closeDB();
   }

关于java - android解析json,删除和插入值到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29887252/

相关文章:

java - 在批处理运行期间检查 NPE

java - Java 中的可重入锁

手机休眠时 Android AlarmManager 不工作

javascript - 如何使用正则表达式从文件中加载 jquery 中的 json?

javascript - 如何从 Vue.js 中的 JSON 文件中获取数据?

java - JVM GC 是否会在引用比较过程中移动对象,导致即使双方都引用同一个对象也无法进行比较?

java - 公开远程接口(interface)或对象模型

android - 状态栏后面的工具栏

android - YUV 到 RGB 转换和显示使用 opengl es 2.0 从 android ndk 使用着色器

javascript - 在 JavaScript 中使用 .JSON