I have Class LocalDatabase in which I comunnicate with SQLiteHelper
public class LocalDatabase extends SQLiteOpenHelper {
...
strings etc...
...
public LocalDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
+ KEY_ID + " VARCHAR(50) PRIMARY KEY,"
+ KEY_NAME + " VARCHAR(50))";
db.execSQL(CREATE_LOGIN_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);
onCreate(db);
}
And in MainActivity I have:
...
private LocalDatabase locDB;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locDB = new LocalDatabase(this);
fbLogin();
}
And then in fbLogin() I have function from FB Developers page and in onComplete() method I have this:
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
UserName = user.getName();
UserId = user.getId();
try {
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
locDB.saveUser(UserId,UserName); //This gave me the exception
}catch(Exception e){
e.printStackTrace();
Toast.makeText(MainActivity.this, "Something f***ed up fataly", Toast.LENGTH_LONG).show();
}
}
}
I checked twice my project even with ctrl+f and searched for "new LocalDatabase" but I created it only once...
My LOGCAT:
03-17 19:39:45.710: W/System.err(6822): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.Hennycz.wheresmybuddy/databases/myDatabase
03-17 19:39:45.790: W/System.err(6822): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
03-17 19:39:45.790: W/System.err(6822): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1437)
03-17 19:39:45.790: W/System.err(6822): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
03-17 19:39:45.790: W/System.err(6822): at com.Hennycz.wheresmybuddy.library.LocalDatabase.saveUser(LocalDatabase.java:51)
03-17 19:39:45.790: W/System.err(6822): at com.Hennycz.wheresmybuddy.MainActivity$2$1.onCompleted(MainActivity.java:168)
03-17 19:39:45.790: W/System.err(6822): at com.facebook.Request$1.onCompleted(Request.java:270)
03-17 19:39:45.790: W/System.err(6822): at com.facebook.Request$4.run(Request.java:1670)
03-17 19:39:45.790: W/System.err(6822): at android.os.Handler.handleCallback(Handler.java:615)
03-17 19:39:45.790: W/System.err(6822): at android.os.Handler.dispatchMessage(Handler.java:92)
03-17 19:39:45.790: W/System.err(6822): at android.os.Looper.loop(Looper.java:137)
03-17 19:39:45.790: W/System.err(6822): at android.app.ActivityThread.main(ActivityThread.java:4838)
03-17 19:39:45.790: W/System.err(6822): at java.lang.reflect.Method.invokeNative(Native Method)
03-17 19:39:45.800: W/System.err(6822): at java.lang.reflect.Method.invoke(Method.java:511)
03-17 19:39:45.800: W/System.err(6822): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
03-17 19:39:45.800: W/System.err(6822): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
03-17 19:39:45.800: W/System.err(6822): at dalvik.system.NativeStart.main(Native Method)
EDIT:
public void saveUser(String id, String name) {
SQLiteDatabase db = this.getWritableDatabase();
if ( checkUser(id) == 0 ) {
ContentValues values = new ContentValues();
values.put(KEY_ID, id);
values.put(KEY_NAME, name);
db.insert(TABLE_LOGIN, null, values);
db.close();
}
else {
db.close();
}
}
public int checkUser(String id) {
String countQuery = "SELECT id FROM " + TABLE_LOGIN + " WHERE id='"+id+"'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int rowCount = cursor.getCount();
db.close();
cursor.close();
return rowCount;
}
Do you have any solution please ?
I think I got it.
getReadableDatabasereturns the same writable database almost always. So after you perform your query incheckUser, you close the same writable database, that you further use insaveUsermethod. And because it it definitely closed by now, you get your beautiful exception.Instead, save your database as a local variable in your helper class, if you intend for further usage and do not close it in
checkUserandsaveUser.You have to manage helper's lifecycle (open and close connection objects, that is) with your
Activitylifecycle in mind. For example, open helper inonCreateand closing inonDestroyof your Activity (bear in mind that it is not the most effective approach).