在SQLite中缺少特定版本的HTC DESIRE HD

时间:2011-01-11 21:38:44

标签: android sqlite

我的应用程序在资产文件夹中有一个SQLite数据库。当用户启动我的应用程序时,将创建数据库并创建表。

这适用于很多设备(Nexus One,Htc Magic,SGS,X10 ......甚至是Htc Desire HD v2.2)。 我的应用程序适用于所有版本的Android(在我的设备上测试(1.6,2.2,2.2.1 Htc Magic)和模拟器(v1,5直到v2.3)。

我只是遇到了 HTC DESIRE HD v2.2.1 1.72.405.3的问题。

logcat:

  

android.database.sqlite.SQLiteException:没有这样的表:LISTE :,编译时:从LISTE中选择_id   在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2833)   在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2854)   在android.app.ActivityThread.access $ 2300(ActivityThread.java:136)   在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2179)   在android.os.Handler.dispatchMessage(Handler.java:99)   在android.os.Looper.loop(Looper.java:143)   在android.app.ActivityThread.main(ActivityThread.java:5068)   at java.lang.reflect.Method.invokeNative(Native Method)   在java.lang.reflect.Method.invoke(Method.java:521)   在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)   at dalvik.system.NativeStart.main(Native Method)   引起:android.database.sqlite.SQLiteException:没有这样的表:LISTE :,编译时:从LISTE中选择_id   在android.database.sqlite.SQLiteCompiledSql.native_compile(本机方法)   在android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)   在android.database.sqlite.SQLiteCompiledSql。(SQLiteCompiledSql.java:64)   在android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:80)   在android.database.sqlite.SQLiteQuery。(SQLiteQuery.java:46)   在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)   在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1417)   在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1387)   ......还有11个

我的应用程序创建数据库,但它不会复制data\data\packagename\databases\mydatabase中资产文件夹的文件表。

我的代码:

public void createDataBase() throws IOException{

 boolean dbExist = checkDataBase();

 if(dbExist){
  //do nothing - database already exist
 }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();

     try {

   copyDataBase();

  } catch (IOException e) {

      throw new Error("Error copying database");

     }
 }

}

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))!= -1){
  if (length > 0){
   myOutput.write(buffer, 0, length); 
  }     }

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

}

我认为copydatabase函数存在问题,但我没有看到。

此代码适用于除 HTC DESIRE HD v2.2.1 1.72.405.3之外的所有设备。

HTC Desire上面给出的版本可能存在哪些问题?如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是一个猜测,并暗示在该版本的Android中为Desire HD存在“错误”,所以我可能会疯狂地离开。

我想知道那个版本的Android是不是应该创建它应该做的数据库。您假设DB_PATH是\ data \ data \ packagename \ databases \,因为它通常会是,但如果不是?结果将是以下......

  1. this.getReadableDatabase()将在\ some \ incorrect \ _path \ mydatabase
  2. 创建一个空数据库
  3. 使用new FileOutputStream(outFileName) 只需创建一个新的空二进制文件 文件,因为上面没有创建 您期望的地方的数据库。
  4. 副本成功发生
  5. 在执行SELECT请求之前,使用getReadableDatabase()getWriteableDatabase()请求访问数据库,但这两个操作只会打开在步骤1中创建的空数据库。
  6. 简而言之,复制过程可能已正常工作,但正在操作的数据库是空的,并且位于您预期的不同位置。

    只是一个想法(我看到这些年来发生过类似的事情)。