I have a piece of code which access an SQLite database, which works perfectly up until Jelly Bean. In which case not all data is taken from the database ( at least the first column is omitted somehow) And also gives the error "unknown error (code 14) could not open database", although some data IS being read from it. Do ask for more details if you don't get the situation
Thank you!
private class DataBaseHelper extends SQLiteOpenHelper {
private SQLiteDatabase myDataBase;
public DataBaseHelper() {
super(myContext, DB_NAME, null, 1);
DB_PATH = "/data/data/" + myContext.getPackageName()
+ "/databases/";
}
/**
* Creates a empty database on the system and rewrites it with your own
* database.
* */
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
// do nothing - database already exist
} else {
// By calling this method and empty database will be created
// into the default system path
// of your application so we are gonna be able to overwrite that
// database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = myContext.getDatabasePath(DB_NAME).getAbsolutePath();
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.NO_LOCALIZED_COLLATORS);
} catch (SQLiteException e) {
// database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just
* created empty database in the system folder, from where it can be
* accessed and handled. This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException {
// Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException {
// Open the database
String myPath =DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
Here is the LogCat error
01-11 14:36:32.153: E/SQLiteLog(15050): (14) cannot open file at line 30174 of [00bb9c9ce4]
01-11 14:36:32.153: E/SQLiteLog(15050): (14) os_unix.c:30174: (2) open(/data/data/eu.isdc.cabinCrew/databases/database.sqlite) -
01-11 14:36:32.183: E/SQLiteDatabase(15050): Failed to open database '/data/data/eu.isdc.cabinCrew/databases/database.sqlite'.
01-11 14:36:32.183: E/SQLiteDatabase(15050): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.b.c(Unknown Source)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.b.a(Unknown Source)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.a.<init>(Unknown Source)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.a.a(Unknown Source)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.activities.TrainingActivity.onCreate(Unknown Source)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.Activity.performCreate(Activity.java:5008)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.access$600(ActivityThread.java:130)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.os.Looper.loop(Looper.java:137)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at java.lang.reflect.Method.invoke(Method.java:511)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-11 14:36:32.183: E/SQLiteDatabase(15050): at dalvik.system.NativeStart.main(Native Method)
01-11 14:36:32.503: E/SQLiteLog(15050): (1) no such table: airdata
It does open the database, but doesn't find that particular table, even if it's there. And this happens only with Jelly Bean. Did anything change with database interaction with this version?
This issue is kind of fixed, it still persists but I found that the real problem was lying with showing the data on the UI with an Auto-fit TextView adapter, which didn't work on jelly Bean. So I still get the 'Failed to open database' exception, but it works anyway, the databse is read.