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:
- 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?
- 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();
orClose();
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