在SD卡上创建数据库

时间:2017-11-30 11:23:08

标签: android android-sqlite android-sdcard

我尝试在SD卡上创建数据库,当我调用getReadableDatabase()时,我得到了

Failed to open database '/storage/sdcard1/xAPP/inventory.db'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database. 

如果我手动将数据库放入SD卡,则会出现以下错误:

Failed to open database '/storage/sdcard1/xAPP/inventory.db'.
android.database.sqlite.SQLiteException: not an error (code 0): Could not open the database in read/write mode.

为什么呢?内部存储和外部存储没有这样的问题。问题可能是SD卡文件系统(FAT32)的格式吗?

P.S。我强调这不是关于外部存储,而是关于可移动存储(SD卡)!如果我使用Environment.getExternalStorageDirectory()一切正常!

UPD1创建数据库:

private InventoryDBHelper(Context context) {
    super(context, Settings.getInstance().getSDCardDir()
            + File.separator + "xAPP"
            + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    // date text yyyy-MM-dd HH:mm:ss
    String sql = String
            .format("CREATE TABLE %s (_key INTEGER PRIMARY KEY, ProductId TEXT, ProductName TEXT, Price DOUBLE, Cost DOUBLE, DateModified TEXT);",
                    TABLE_INVENTORY);
    db.execSQL(sql);

    sql = String
            .format("CREATE TABLE %s (ProductId INTEGER, ProductQuantity INTEGER);",
                    TABLE_QUANTITY);
    db.execSQL(sql);
}

UPD2:我必须重新打开这个问题,因为这只能在调试模式下运行,甚至不能一直使用!

UPD3如果我得到如下目录,则可以正常工作:

 File[] dbDirs = ContextCompat.getExternalFilesDirs(context, null);
    if (dbDirs[1] != null) {
        return dbDirs[1].getAbsolutePath();
    } else {
        return dbDirs[0].getAbsolutePath();
    }

1 个答案:

答案 0 :(得分:0)

首先尝试在SD卡上创建该目录。你会看到你不会成功。

Micro SD卡仅适用于现代Android版本。

除了一个特定于应用程序的目录。

如果你运气好的话。

尝试将数据库设为

/storage/sdcard1/Android/data/<packagename>/files/xAPP/inventory.db