2014-07-08 17 views
13

Chúng tôi có một cơ sở dữ liệu sqlite trong Ứng dụng của chúng tôi. Làm việc tốt cho tất cả người dùng nhưng một vài người trong số họ gặp phải lỗi Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings.Gây ra bởi: android.database.sqlite.SQLiteException: không có bảng như vậy: (mã 1) Android

Dưới đây là lớp trợ giúp sqlite của tôi để tạo db và nhật ký lỗi. Trong assert/Master.db chúng tôi có bảng generalSettings. Nhưng sau khi sao chép nó vào thiết bị thì bảng bị thiếu. Điều này chỉ xảy ra với một vài người dùng. Tôi đã tìm kiếm giải pháp nhưng tôi không thể tìm được giải pháp chính xác. Nhóm hãy giúp tôi sửa lỗi này.

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

    } 
} 

Lỗi 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 
+0

Bạn có đang viết bản sao được triển khai của cơ sở dữ liệu của mình lên cơ sở dữ liệu mà Android sẽ tạo không? Tôi nghĩ đó là một ý tưởng tồi vì Android giữ một số dữ liệu cá nhân trong chính cơ sở dữ liệu. – brummfondel

+0

@brummfondel - Chúng tôi có 10 bảng và một số dữ liệu tĩnh trong Db. Vì vậy, việc tạo db sẽ mất nhiều thời gian. Vì vậy, chúng tôi đã sao chép cơ sở dữ liệu trong Android. Xin vui lòng cho tôi biết cách tốt nhất để làm điều này. – Sniper

+0

Tôi đang gặp phải sự cố tương tự sau khi thử nghiệm ứng dụng của mình trên một số thiết bị & trình giả lập http://stackoverflow.com/questions/24406326/no-such-table-in-api-2-2 –

Trả lời

18

Vấn đề là vì một số thiết bị được nâng cấp ứng dụng của bạn, do đó checkDataBase() trở true, vì vậy bạn không được gọi copyDataBase(). Vì vậy, bạn đang sử dụng cơ sở dữ liệu trước đó mà không có bảng generalSettings. Để giải quyết vấn thử này:

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

và cũng cập nhật constructor của bạn:

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

nếu câu trả lời này giải quyết được vấn đề của bạn, vui lòng đánh dấu nó là câu trả lời đúng. –

+0

Có thể OnUpgrabde được gọi với một newVersion thực sự thấp hơn oldVersion? –

+0

có nó sẽ gọi. –

0

nó là một ngoại lệ nâng cấp. Hãy chắc chắn rằng bạn có bảng trong cơ sở dữ liệu trước đó của bạn. Nếu không, hãy tạo nó. PS: nếu bạn mới phát triển ứng dụng này, hãy gỡ cài đặt ứng dụng khỏi trình mô phỏng hoặc thiết bị của bạn và cài đặt lại. Nhưng nó không được khuyến cáo cho các dữ liệu ne sẽ bị mất.

3

Lỗi này xảy ra bởi vì bạn không sử dụng DATABASE_VERSION

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static SQLiteDatabase sqliteDb; 

    private static DatabaseHelper instance; 

    private static final int DATABASE_VERSION = 1; 

Tăng Phiên bản của bạn mỗi khi bạn thực hiện thay đổi trong cơ sở dữ liệu của bạn chỉ cần tăng DATABASE_VERSION với 1 ..

5

Một giải pháp khả thi chỉ được gỡ bỏ cài đặt một Ứng dụng từ trình mô phỏng Android và sau đó chạy lại nó.

Nếu bạn chỉ muốn xóa một ứng dụng:

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 Version DataBase của bạn Hoặc Đầu tiên Uninstall Ứng dụng của bạn Trong Emulator hoặc điện thoại và Cài đặt lại . I Bằng cách này Hãy suy nghĩ vấn đề của bạn Sẽ được giải quyết.

0

Nếu bạn đang sử dụng GreenDao và nhận lỗi này, hãy chắc chắn bạn đang bỏ cài đặt ứng dụng và thử lại.Điều này giải quyết vấn đề của tôi

9

Sau khi trải qua vài giờ, tôi có giải pháp này:

1) Cài đặt> Ứng dụng Quản lý

2) Chọn App

3) Xóa dữ liệu

4) Gỡ cài đặt ứng dụng

Bây giờ Chạy ứng dụng từ Android Studio

Hy vọng công trình này hoạt động đúng cách

+0

điều này làm việc cho tôi cảm ơn bạn. –

0

Giả sử nếu bạn chạy ứng dụng của mình với Cơ sở dữ liệu phiên bản 1, thì bạn phải thay đổi cấu trúc bảng hoặc thêm bảng mới. nó.

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

Tăng giá trị DATABASE_VERSION này nếu có thay đổi.

Các vấn đề liên quan