gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:24:35 25 4
gpt4 key购买 nike

我的应用程序在 Assets 文件夹中有一个 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 的问题。

日志:

android.database.sqlite.SQLiteException: no such table: LISTE: , while compiling: select _id from LISTE at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2833) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2854) at android.app.ActivityThread.access$2300(ActivityThread.java:136) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2179) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:143) at android.app.ActivityThread.main(ActivityThread.java:5068) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) at dalvik.system.NativeStart.main(Native Method) Caused by: android.database.sqlite.SQLiteException: no such table: LISTE: , while compiling: select _id from LISTE at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) at android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:64) at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:80) at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:46) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1417) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1387) ... 11 more

我的应用程序创建了数据库,但它没有复制 data\data\packagename\databases\mydatabase 中 Assets 文件夹文件的表。

我的代码:

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,这里可能存在什么问题?如何补救?

最佳答案

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

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

  1. this.getReadableDatabase() 将在\some\incorrect\path\mydatabase 处创建一个空数据库
  2. 使用
    文件输出流(输出文件名)
    简单地创建一个新的空二进制文件文件,因为上面没有创建位于您期望的位置的数据库。
  3. 复制成功
  4. 在执行 SELECT 请求之前,使用 getReadableDatabase()getWriteableDatabase() 请求访问数据库,但这两者都只会打开空数据库在步骤 1 中创建。

简而言之,复制过程可能工作正常,但正在操作的数据库是空的,并且与您期望的位置不同。

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

关于android - 特定版本的 HTC DESIRE HD 在 SQLite 中缺少表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4662941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com