gpt4 book ai didi

android - 将 sqlite 数据库复制到 android 设备失败

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:32 25 4
gpt4 key购买 nike

我有一个 sqlite 数据库,我将其复制到“ Assets ”文件夹中。在我的程序中,我检查数据库是否已经存在,如果不存在,我创建一个新的并复制它。我(或多或少)使用了 http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/comment-page-2/ 中的代码

    public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();

if (dbExist) {
Log.i(DEBUG_TAG, "createDataBase -> Datenbank existiert");
// 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();
Log.i(DEBUG_TAG, "else, db existiert nicht 1");
try {
copyDataBase();
Log.i(DEBUG_TAG, "nach copydatabase");
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}

/**
* Checked ob Database bereits existiert
*
* @return
*/
private boolean checkDataBase() throws SQLiteException {
SQLiteDatabase checkDB = null;
Boolean checkTable = false;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
Log.i(DEBUG_TAG, "checkdatabase1");

} catch (SQLiteException e) {
Log.e(DEBUG_TAG, "Fehler checkDataBase: ", e);
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}

/**
* Copies your database from your local assets-folder to the just created
* empty database in the system folder, from where it can be accessed and
* handled. This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException {
// Open your local db as the input stream
InputStream myInput = dbContext.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();
Log.i(DEBUG_TAG, "copydatabase");
}

在模拟器中它工作得很好。

然后我尝试在我的设备 (HTC Desire HD) 上运行它。我收到以下消息:

03-26 17:02:05.053: INFO/Database(24458): sqlite returned: error code = 14, msg = cannot open file at line 27206 of [42537b6056]

当我第一次尝试打开数据库时,就会发生这种情况。当我在模拟器中运行该程序时,我没有收到此消息。当我第二次运行程序时,它找到了数据库,打开没有错误,但表不存在。

我在模拟器和设备上调试了好几次程序,都没有找到解决办法。

这可能是某种权限问题吗? (因为我也无法在 adb --> permission denied' 的设备上看到数据库)

我是 android 的新手,所以也许我只是错过了一些愚蠢的东西......

谢谢

最佳答案

  1. 不要通过字符串连接创建路径。使用适当的 File 构造函数。
  2. 您的 DB_PATH 可能无效,但由于您拒绝显示,我们无法确定。
  3. 如果此代码来自的类是 SQLiteOpenHelper,您对 getReadableDatabase() 的调用将创建一个空数据库。
  4. “(因为我也无法使用 adb 查看设备上的数据库 --> 权限被拒绝'”——这是预料之中的,因为您无权在生产设备上查看该目录。

关于android - 将 sqlite 数据库复制到 android 设备失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443960/

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