我的应用程序在 asset 文件夹中有一个 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 欲望高清 v2.2.1 1.72.405.3。
日志猫:
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)
在 java.lang.reflect.Method.invokeNative(本机方法)
在 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)
在dalvik.system.NativeStart.main(本机方法)
导致:android.database.sqlite.SQLiteException:没有这样的表:LISTE:,编译时:select _id from LISTE
在 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
.
My code:
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 欲望高清 v2.2.1 1.72.405.3。
对于上述给定版本的 HTC Desire 可能存在哪些问题?如何补救?
这只是一个猜测,意味着 Desire HD 的 Android 版本存在一个“错误”,所以我可能会非常失望。
我想知道那个版本的 Android 是否没有在它应该创建的地方创建数据库。您假设 DB_PATH 通常是 \data\data\packagename\databases\ 但如果不是怎么办?结果如下......
-
this.getReadableDatabase()
将在 \some\in Correct\path\mydatabase 创建一个空数据库
- Using
new
FileOutputStream(outFileName)
只需创建一个新的空二进制文件
文件,因为上面没有创建
数据库位于您期望的位置。
- 复制成功
- 在执行 SELECT 请求之前,使用以下任一方法请求访问数据库:
getReadableDatabase()
or getWriteableDatabase()
但这两者都只会打开在步骤 1 中创建的空数据库。
简而言之,复制过程很可能工作正常,但正在操作的数据库是空的,并且位于与您期望的位置不同的位置。
只是一个想法(多年来我见过类似的事情发生)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)