2014-07-08 14 views
13

Abbiamo un database SQLite nella nostra applicazione. Funziona bene per tutti gli utenti, ma pochi di loro hanno riscontrato l'errore Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings.Causato da: android.database.sqlite.SQLiteException: nessuna tabella di questo tipo: (codice 1) Android

Di seguito è la mia classe di supporto sqlite per creare il db e il log degli errori. In assert/Master.db abbiamo la tabella generalSettings. Ma dopo averlo copiato sul dispositivo manca il tavolo. Questo sta accadendo solo per pochi utenti. Ho cercato la soluzione ma non trovo quella esatta. Squadra per favore aiutami a risolvere questo problema.

Codice:

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) { 

    } 
} 

Registro errori:

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 
+0

Stai scrivendo una copia distribuita del tuo database su quella che avrebbe creato Android? Penso che sia una cattiva idea dato che Android detiene alcuni dati privati ​​nel database stesso. – brummfondel

+0

@brummfondel - Abbiamo 10 tabelle e alcuni dati statici nel Db. Quindi creare il db richiederà molto tempo. Quindi abbiamo copiato il database in Android. Per favore fatemi sapere il modo migliore per farlo. – Sniper

+0

Sto affrontando lo stesso problema dopo aver provato la mia app su alcuni dispositivi ed emulatori http://stackoverflow.com/questions/24406326/no-such-table-in-api-2-2 –

risposta

18

Il problema è perché alcuni dei dispositivi sta aggiornando la vostra applicazione, in modo che il ritorno checkDataBase()true, in modo che non sta chiamando copyDataBase(). Quindi stai usando il database precedente che non ha la tabella generalSettings. per risolvere questo tentativo:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
if(newVersion>oldVersion) 
    copyDatabase(); 
} 

e inoltre aggiornare il costruttore:

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); 

} 
+0

se questa risposta ha risolto il tuo problema, per favore segnalo come risposta corretta. –

+0

Si può chiamare OnUpgrabde con una nuova versione effettivamente inferiore alla vecchiaVersione? –

+0

sì chiamerà. –

0

è un'eccezione aggiornamento. Assicurati di avere la tabella nel tuo database precedente. In caso contrario, crearlo. PS: se hai appena sviluppato questa app, disinstallala dal tuo emulatore o dal tuo dispositivo e re-installa. Ma non è raccomandato per i dati non sarà perso.

3

Questo errore si verifica perché non si utilizza Database_Version

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static SQLiteDatabase sqliteDb; 

    private static DatabaseHelper instance; 

    private static final int DATABASE_VERSION = 1; 

aumentare la vostra versione ogni volta che si apportano modifiche nel database solo aumentano Database_Version con uno ..

5

Un'altra possibile soluzione è solo una disinstallazione App dall'emulatore Android e dopo eseguirla di nuovo.

Se si desidera solo per rimuovere un'applicazione:

1.Start the emulator. 
2.Open the Android settings app. 
3.Select "Applications" (Called "Apps" on Android 4.0 or higher) 
4.Select "Manage Applications" (Only on Android 3.2 or lower) 
5.Select the application you want to uninstall. 
6.Click "Uninstall" 
0

1.Cambia il database versione O prima disinstallare le tue applicazioni nell'emulatore o Telefono e reinstallare . I In questo modo Pensi che il tuo problema sarà risolto.

0

Se si sta utilizzando GreenDao e si ottiene questo errore, assicurarsi di non essere in grado di riprodurre l'app e riprovare.Ciò ha risolto il mio problema

9

Dopo aver trascorso qualche ora ho ottenuto questa soluzione:

1) Impostazioni> Gestione applicazioni

2) Selezionare App

3) Elimina i dati

4) Disinstallare App

Ora eseguire l'app da Android Studio

Spero che funzioni correttamente

+0

questo funziona per me grazie. –

0

Supponiamo che se si esegue l'applicazione con Database versione 1, se si modifica la struttura della tabella o si aggiunge una nuova tabella, è necessario aumentare la versione del database su 2 e ulteriormente se si apportano ulteriori modifiche a esso.

public class AppDatabase extends SQLiteOpenHelper { 

    // Database Name 
    private static final String DATABASE_NAME = "myDatabase"; 

    // Database Version 
    private static final int DATABASE_VERSION = 1;  

    public AppDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

Aumentare questo valore DATABASE_VERSION se si apportano modifiche.

Problemi correlati