【问题标题】:Creating a database on an SD card在 SD 卡上创建数据库
【发布时间】:2017-11-30 11:23:07
【问题描述】:

我尝试在 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) 的格式上吗?

附:我强调这不是关于外部存储,而是关于可移动存储(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();
    }

【问题讨论】:

标签: android android-sqlite android-sdcard


【解决方案1】:

首先尝试在 sdcard 上创建该目录。你会发现你不会成功。

Micro SD 卡对于现代 Android 版本是只读的。

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

如果你幸运的话。

尽量把数据库设为

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

【讨论】:

  • 这是SDK的限制吗?我在哪里可以读到这方面的信息?
  • 嗯,您需要WRITE_EXTERNAL_STORAGE 权限,才能使用与应用特定文件夹不同的文件夹?
  • 没有。他说,OP 已经拥有该权限,因为它适用于 getExternalStorage。
  • 相同:无法打开数据库“/storage/sdcard1/Android/data/com.xxx.xxx/files/xAPP/inventory.db”。 android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(代码 14):无法打开数据库
  • 错了。这是必需的。仅 getExternalFilesDir() 不需要。
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 2018-05-18
  • 2012-10-08
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2016-04-18
相关资源
最近更新 更多