2012-07-23 66 views
0

我在從資產複製數據庫時遇到問題。當我的數據庫有一個小例子300KB它工作正常。但是當我的數據庫達到2.5mb時發生錯誤。在創建新的AVD後它工作正常。也許它的模擬器的SD卡導致錯誤?因爲當我在我的設備中安裝我的應用程序時,它正在工作。無法從「資產」複製大型數據庫文件

以下是登錄貓說:

07-23 18:12:51.522: E/AndroidRuntime(866): Uncaught handler: thread main exiting due to uncaught exception 
07-23 18:12:51.531: E/AndroidRuntime(866): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.frux.kfcmobile/com.frux.kfcmobile.KFCmobileActivity}: android.database.sqlite.SQLiteException: no such table: first: , while compiling: SELECT * from first 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.os.Looper.loop(Looper.java:123) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.ActivityThread.main(ActivityThread.java:4363) 
07-23 18:12:51.531: E/AndroidRuntime(866): at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 18:12:51.531: E/AndroidRuntime(866): at java.lang.reflect.Method.invoke(Method.java:521) 
07-23 18:12:51.531: E/AndroidRuntime(866): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-23 18:12:51.531: E/AndroidRuntime(866): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-23 18:12:51.531: E/AndroidRuntime(866): at dalvik.system.NativeStart.main(Native Method) 
07-23 18:12:51.531: E/AndroidRuntime(866): Caused by: android.database.sqlite.SQLiteException: no such table: first: , while compiling: SELECT * from first 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteProgram.native_compile(Native Method) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1220) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1193) 
07-23 18:12:51.531: E/AndroidRuntime(866): at com.frux.kfcmobile.KFCmobileActivity.onCreate(KFCmobileActivity.java:42) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-23 18:12:51.531: E/AndroidRuntime(866): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
07-23 18:12:51.531: E/AndroidRuntime(866): ... 11 more 

這裏是我的DBHelper代碼:

public class DatabaseHelper extends SQLiteOpenHelper{ 

private static String DB_PATH = "/data/data/com.frux.kfcmobile/databases/"; 
private static String DB_NAME = "database"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 
private static final int DATABASE_VERSION = 1; 


public DatabaseHelper(Context context) { 
    // TODO Auto-generated constructor stub 
    super(context, DB_NAME, null, DATABASE_VERSION); 
    this.myContext = context; 


} 
public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 

     if(dbExist){ 
      //do nothing - database already exist 
      this.getWritableDatabase(); 
      this.close(); 
     }else{ 

      //By calling this method and empty database will be created into the default system path 
       //of your application so we are gonna be able to overwrite that database with our database. 
      this.getReadableDatabase(); 
      this.close(); 
      try { 

       copyDataBase(); 

      } catch (IOException e) { 

      //throw new Error("Error copying database message"); 

      } 
     } 

    } 

private boolean checkDataBase(){ 

     SQLiteDatabase checkDB = null; 

     try{ 
      String myPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     }catch(SQLiteException e){ 

      //database does't exist yet. 

     } 

     if(checkDB != null){ 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 
    } 



private void copyDataBase() throws IOException{ 

     //Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DB_NAME; 

     //Open the empty db as the output stream 
     OutputStream myOutput = new FileOutputStream(outFileName); 

     //transfer bytes from the inputfile to the outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 

     //Close the streams 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 



public void openDataBase() throws SQLException{ 

     //Open the database 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    } 

    @Override 
    public synchronized void close() { 

      if(myDataBase != null) 
       myDataBase.close(); 

      super.close(); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 


    } 





    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 


    } 

}

回答

0

按照錯誤數據庫中有沒有名爲first表。它似乎被複制。

+0

它有。因爲當數據庫確實具有小尺寸時,它可以正常工作。但是當我插入字段和數據,然後它達到2.5MB的大小,並啓動錯誤,並創建數據庫,唯一的表是android_metadata – User 2012-07-23 10:54:52

0

在logcat的

Caused by: android.database.sqlite.SQLiteException: no such table: first: , while compiling: SELECT * from first 

考慮這條線根據它說,有沒有所謂的「第一」的表格。但是你說它在模擬器中工作: -/

轉到DDMS查看並檢查您創建的數據庫。使用SQLite瀏覽器瀏覽您創建並導出的數據庫。

+0

當我查看數據庫它只有android_metadata表。但是當數據庫有一個小的大小時,它複製所有的表 – User 2012-07-23 10:36:42

+0

首先,我嘗試創建一個新的數據庫,它的工作原理。那麼當我在同一個數據庫中添加字段和數據並達到2.5mb時,即錯誤開始時 – User 2012-07-23 10:38:47

+0

爲什麼不把代碼放在這裏?然後我們也可以瞭解這個問題。您創建數據庫並插入數據的代碼片段可能就足夠了。 – AnujAroshA 2012-07-23 10:42:48

相關問題