Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Caused by: android.database.sqlite.SQLiteException: no such table: (code 1) Android

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 
like image 669
Sniper Avatar asked Jul 08 '14 14:07

Sniper


People also ask

Why does livedata raise sqliteexception when deleting a table?

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.

How to add a new table in SQLite database?

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.

Can AnkiDroid dump corrupt SQLite data?

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.

Where is the database stored on an Android phone?

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.


1 Answers

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);  } 
like image 92
Ratul Ghosh Avatar answered Sep 20 '22 01:09

Ratul Ghosh