We have a sqlite database in our Application. Its working fine for all the users but few of them experiencing the Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
error.
Below is my sqlite helper class to create the db and the error log. In assert/Master.db
we have the table generalSettings
. But after copying it to the device the table is missing. This is happening only for few users. I searched for the solution but I cant find the exact one. Team please help me to fix this.
Code:
import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.util.Log; public class InstallDB extends SQLiteOpenHelper { Context ctx; String DBNAME; String DBPATH; Modules modObj = new Modules(); public InstallDB(Context context, String name) { super(context, name, null, 1); this.ctx = context; this.DBNAME = name; this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath(); Log.e("Path 1", DBPATH); } public void createDataBase() { boolean dbExist = checkDataBase(); SQLiteDatabase db_Read = null; if (!dbExist) { synchronized (this) { db_Read = this.getReadableDatabase(); Log.e("Path 2", this.getReadableDatabase().getPath()); db_Read.close(); copyDataBase(); Log.v("copyDataBase---", "Successfully"); } // try { // } catch (IOException e) { // throw new Error("Error copying database"); // } } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DBPATH; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } catch (Exception e) { Log.i("SQLite Error", "database does't exist yet."); } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } private void copyDataBase() { try { InputStream myInput = ctx.getAssets().open(DBNAME); String outFileName = DBPATH; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024 * 3]; int length = 0; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } catch (Exception e) { Modules.stacTaceElement = e.getStackTrace(); StringWriter stackTrace1 = new StringWriter(); e.printStackTrace(new PrintWriter(stackTrace1)); System.err.println(stackTrace1); Intent send = new Intent(Intent.ACTION_SENDTO); String uriText; uriText = "mailto:[email protected]" + "&subject=Error Report" + "&body=" + stackTrace1.toString(); uriText = uriText.replace(" ", "%20"); Uri uri = Uri.parse(uriText); send.setData(uri); ctx.startActivity(Intent.createChooser(send, "Send mail...")); // TODO: handle exception } } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
Error Log:
java.lang.RuntimeException: Unable to start activity ComponentInfo{palmagent.FidelityAgent.Two/palmagent.FidelityAgent.Two.PassNew}: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269) at android.app.ActivityThread.access$800(ActivityThread.java:139) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5102) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) at palmagent.FidelityAgent.Two.masterDatabase.selectquery(masterDatabase.java:59) at palmagent.FidelityAgent.Two.Modules.checkDatabase(Modules.java:28825) at palmagent.FidelityAgent.Two.PassNew$LoaduserDetails.onPreExecute(PassNew.java:140) at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) at android.os.AsyncTask.execute(AsyncTask.java:535) at palmagent.FidelityAgent.Two.PassNew.onCreate(PassNew.java:120) at android.app.Activity.performCreate(Activity.java:5248) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173) ... 11 more
During the deletion process, the LiveData that I observe from the database raises SQLiteException: no such table and of course it's logical, because the LiveData senses that the underlying data is changed, and tries to get the new data, and finds that the table is gone.
So if you want to add a table you need to increment the database version and add @Override public void onUpgrade (final SQLiteDatabase database, final int oldVersion, final int newVersion) { YourTable.onCreate (database); } Show activity on this post.
So the corruption is either in the binary structure of the sqlite database created by AnkiDroid export or sqlite3 omits the corrupted data when making a dump. Sorry, something went wrong. Sorry for spamming this thread, but I'm still having issues.
Non-rooted stock Android. The database is stored in the internal memory so it's not that it's some old, worn-out SD card failing. Sorry, something went wrong.
The problem is because some of device is upgrading your app, so the checkDataBase()
returning true
, so you are not calling copyDataBase()
. So you are using previous database which doesn't have generalSettings
table. To solve this try:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(newVersion>oldVersion) copyDatabase(); }
and also update your constructor:
public InstallDB(Context context, String name) { super(context, name, null, DB_VERSION); // DB_VERSION is an int,update it every new build this.ctx = context; this.DBNAME = name; this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath(); Log.e("Path 1", DBPATH); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With