2014-07-08 6 views
13

Wir haben eine SQLite-Datenbank in unserer Anwendung. Es funktioniert gut für alle Benutzer, aber nur wenige von ihnen erleben den Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings Fehler.verursacht durch: android.database.sqlite.SQLiteException: keine solche Tabelle: (Code 1) Android

Unten ist meine SQLite-Helfer-Klasse, um die db und das Fehlerprotokoll zu erstellen. In assert/Master.db haben wir die Tabelle generalSettings. Aber nach dem Kopieren auf das Gerät fehlt die Tabelle. Dies geschieht nur für wenige Benutzer. Ich suchte nach der Lösung, aber ich kann den genauen nicht finden. Team bitte hilf mir das zu beheben.

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

    } 
} 

Fehlerprotokoll:

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

Schreiben Sie eine bereitgestellte Kopie Ihrer Datenbank auf diejenige, die Android erstellen würde? Ich denke, das ist eine schlechte Idee, da Android einige private Daten in der Datenbank selbst hält. – brummfondel

+0

@brummfondel - Wir haben 10 Tabellen und einige statische Daten im Db. Das Erstellen der Datenbank dauert lange. Also haben wir die Datenbank in Android kopiert. Bitte lassen Sie mich den besten Weg wissen, dies zu tun. – Sniper

+0

Ich habe das gleiche Problem nach dem Testen meiner App auf einigen Geräten und Emulatoren http://stackoverflow.com/questions/24406326/no-such-table-in-api-2-2 –

Antwort

18

Das Problem ist, weil einige von Gerät Ihre Anwendung aktualisieren, so dass die checkDataBase()true Rückkehr, so dass Sie nicht copyDataBase() nennend. Sie verwenden also vorherige Datenbank, die keine generalSettings Tabelle hat. dieses zu lösen versuchen:

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

und auch Konstruktor aktualisieren:

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

, wenn diese Antwort Ihr Problem gelöst, bitte Markieren Sie es als richtige Antwort. –

+0

Kann OnUpgrabde mit einer neuen Version tatsächlich niedriger als die alte Version aufgerufen werden? –

+0

ja wird es anrufen. –

0

es ist eine Aufwertung Ausnahme. Stellen Sie sicher, dass Sie die Tabelle in Ihrer vorherigen Datenbank haben. Wenn nicht, erstellen Sie es. PS: Wenn du diese App neu entwickelst, deinstalliere sie von deinem Emulator oder deinem Gerät und installiere sie neu. Aber es wird nicht empfohlen für die Daten ne verloren zu gehen.

3

Dieser Fehler tritt auf, weil Sie nicht Database_Version verwenden

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static SQLiteDatabase sqliteDb; 

    private static DatabaseHelper instance; 

    private static final int DATABASE_VERSION = 1; 

Steigern Sie Ihre Version jedes Mal, wenn Sie Änderungen nur Database_Version mit +1 erhöhen in Ihrer Datenbank machen ..

5

Eine andere mögliche Lösung ist nur ein deinstallieren App aus dem Android-Emulator und danach erneut ausführen.

Wenn Sie nur eine Anwendung entfernen möchten:

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.Change Ihre DataBase Version Oder zuerst deinstallieren Ihre Apps im Emulator oder Telefon und installieren . I Auf diese Weise Denken Sie Ihr Problem wird gelöst werden.

0

Wenn Sie GreenDao verwenden und diesen Fehler erhalten, stellen Sie sicher, dass Sie die App deinstallieren und erneut versuchen.Dies löste mein Problem

9

Nachdem er zwei Stunden ich diese Lösung bekam:

1) Einstellungen> Application Manager

2) Wählen App

3) Daten löschen

4) Deinstallieren Sie die App

Jetzt App von Android Studio

ausführen

+0

das funktioniert für mich danke. –

0

Angenommen, Sie führen Ihre App mit der Datenbankversion 1 aus. Wenn Sie die Tabellenstruktur ändern oder eine neue Tabelle hinzufügen, müssen Sie die Datenbankversion auf 2 und weiter erhöhen es.

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

Erhöhen Sie diesen Wert DATABASE_VERSION, wenn Änderungen vorgenommen werden.

Verwandte Themen