1

I am trying to do update values by calling delete and insert methods that i created in the database class. However this doenst work as i expected. Whenever the activity called the delete method will be executed and giving null values, and when the activity called again for the second time, it will have the value(i use toast text to get the value and surround it with try and catch which will give exception invalid index #(the array list index zero until the last index) size is zero). However i am doing this task using asynctask, here is what i tried to do:

@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;
        }

the methods i use from database class(which is named as DatabaseMaster2): example:

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);
    }

and calling it here:

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);
                        }   
                    }

then the checking the row if its empty:

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 for 2nd problem:

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)

then after i put DatabaseMaster2.closeDB(); the closedb method:

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

the logcat changed:

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

i put the closeDB(); here:(on one for loop then on all the for loops, the logcat is the same)

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();
                    }

the problem:

  1. when the activity called it will delete the values from the row(s), then when its called on the second time it will then insert the values. Any suggestion/idea?
  2. After i run and re-run the app for several times it will give memory leak, saying db was never close. Where to put closeDB(); or Close(); properly?

Note: parsing JSON worked just fine. If you ask am i sure, the answer is yes pretty sure. proof here

UPDATE problem 1: Deleting and inserting also work perfectly, what i am trying to do is delete if rows are empty then insert, else it will insert(if its already empty) .But it happen to delete on 1st activity called then giving empty values, when i close the activity and call it again it will run the else condition which will insert the data. The problem is the value will be there when if the user run the app twice, if the user only run 1 time there will be no values.

UPDATE problem 2: Trying to do this based on the answer:

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();
                        }
                    }

after several times re-running the app it gives error:

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)

The problem 1: I want to insert after delete before the else condition, is it possible?

UPDATED problem 1 i try this and failed

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();
                        }
                    }

then this:

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();
                        }
                    }

1st run was smooth then After several(2-7 times) re-run it still gives the same error, saying close was never explicitly called. Any idea why is this happening here? i just want to avoid the app crash when the app installed on real device

Community
  • 1
  • 1
Jedi Fighter
  • 377
  • 1
  • 4
  • 20

1 Answers1

2

Need to close connection properly because executing new query. current implementation is trying to execute more then one query.

Currently calling checkErates method more then one time which is not required:

  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();
   }
ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
  • i didnt calling it several times, there are different methods(i put 1 as example, to avoid long post).. And its still happening the logcat about close() was explicitly called on the database(its the cursor i think). Should i put cursor.close(); inside if statement(which is inside the database and is the checking method) before return and else before return line? – Jedi Fighter Apr 27 '15 at 05:02
  • @JediFighter: No, please show updated code according to my answer – ρяσѕρєя K Apr 27 '15 at 05:03
  • Updated,, any idea about problem 1? – Jedi Fighter Apr 27 '15 at 05:58
  • @JediFighter: then what is issue just call method to insert new values in db and close db again?? – ρяσѕρєя K Apr 27 '15 at 06:04
  • i did, but it gives the same error, close was never explicitly called...It happens whenever i re-run the app several times, but when i run it only one time, no error. This what i dont understand, emulator/eclipse bug perhaps? – Jedi Fighter Apr 27 '15 at 06:20