我的应用程序在资产文件夹中有一个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上面给出的版本可能存在哪些问题?如何解决这个问题?
答案 0 :(得分:0)
这是一个猜测,并暗示在该版本的Android中为Desire HD存在“错误”,所以我可能会疯狂地离开。
我想知道那个版本的Android是不是应该创建它应该做的数据库。您假设DB_PATH是\ data \ data \ packagename \ databases \,因为它通常会是,但如果不是?结果将是以下......
this.getReadableDatabase()
将在\ some \ incorrect \ _path \ mydatabase new
FileOutputStream(outFileName)
只需创建一个新的空二进制文件
文件,因为上面没有创建
您期望的地方的数据库。getReadableDatabase()
或getWriteableDatabase()
请求访问数据库,但这两个操作只会打开在步骤1中创建的空数据库。简而言之,复制过程可能已正常工作,但正在操作的数据库是空的,并且位于您预期的不同位置。
只是一个想法(我看到这些年来发生过类似的事情)。