首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android assets 目錄下 SQLite 數據庫複製失敗:路徑構建與 openOrCreateDatabase 用法錯誤

     編輯:程式設計綜合問答

錯誤代碼分析

String filePath = "data/data/com.datab.cn/mobile.db";  // 缺少前導 "/"
File jhPath = new File(filePath);
SQLiteDatabase.openOrCreateDatabase(jhPath, null);     // 參數錯誤:第一參數需文件路徑字符串

核心問題

  1. 路徑缺少根目錄:應為 /data/data/package.name/databases/。
  2. assets 數據庫不可直接打開:assets 內文件只讀,必須先複製到應用私有目錄。
  3. openOrCreateDatabase(String path, ...) 接受路徑字符串,非 File 對象。

標準複製流程

private static final String DB_NAME = "mobile.db";
private static final String DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";

public SQLiteDatabase openDatabase(Context context) {
    File dbFile = new File(DB_PATH + DB_NAME);
    if (dbFile.exists()) return SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);

    // 複製 assets → 目標目錄
    File dir = new File(DB_PATH);
    if (!dir.exists()) dir.mkdirs();
    try (InputStream is = context.getAssets().open(DB_NAME);
         FileOutputStream fos = new FileOutputStream(dbFile)) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) > 0) fos.write(buffer, 0, len);
    } catch (IOException e) { throw new RuntimeException("DB copy failed", e); }

    return SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);
}

最佳實踐

  • 使用 SQLiteAssetHelper 庫(com.readystatesoftware.sqliteasset:sqliteassethelper:+)一行代碼搞定複製與升級。
  • 數據庫版本升級實現 onUpgrade 執行遷移腳本。
  • 避免在主線程複製大數據庫,啟動時顯示進度或放入線程池。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved