无法从“资产”复制大型数据库文件

问题描述:

我在从资产复制数据库时遇到问题。当我的数据库有一个小例子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) { 


    } 

}

按照错误数据库中有没有名为first表。它似乎被复制。

+0

它有。因为当数据库确实具有小尺寸时,它可以正常工作。但是当我插入字段和数据,然后它达到2.5MB的大小,并启动错误,并创建数据库,唯一的表是android_metadata – User 2012-07-23 10:54:52

见下面的教程

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

有大约1.2 MB的限制在资源文件夹的文件。

如果工作正常“因为当我在我的设备中安装我的应用程序,它正在工作。”那么你的问题是什么。

+0

问题是当我在我的模拟器中运行应用程序它导致错误 – User 2012-07-23 10:37:37

在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