android - 为什么在 list 中使用 min-sdk 标签时位于 sdcard 上的 sqlite 数据库只读?

标签 android android-manifest

我一周前在 Android 开发者列表上发布了这个问题,但到目前为止没有任何回应。

我遇到了一个奇怪的问题。我使用位于/sdcard/上的数据库,出于某种原因,每当我添加 <uses-sdk android:minSdkVersion="8" /> list sqlite 以只读方式打开数据库。它也变得有点奇怪。下面的代码打开数据库并检查数据库是否只读,返回 false:

db = SQLiteDatabase.openDatabase("/sdcard/test.db3", null, SQLiteDatabase.OPEN_READWRITE); Log.i(LOGTAG, "Database status: " + db.isReadOnly());

但是,如果我尝试写入任何数据,它会轰炸:

INFO/Database(6576): sqlite returned: error code = 8, msg = prepared statement aborts at 24: [INSERT INTO tags(type_id , tag) VALUES(?, ?);] ERROR/Database(6576): Error inserting type_id =1 tag=TestTag ERROR/Database(6576): android.database.sqlite.SQLiteException: error code 8: attempt to write a readonly database

如果我从 list 中删除 uses-sdk 标签,一切正常。我在模拟器、运行 2.2.1 的 NexusOne 和 Galaxy Tab 上验证了这种行为。这是一个已知的问题?有解决方法吗?

任何帮助将不胜感激。

最佳答案

您需要WRITE_EXTERNAL_STORAGE 权限。

此外,永远永远永远永远永远永远永远不要按照您的方式硬编码外部存储的路径。您的代码将在 Android 2.2 设备上中断。您的代码将在其他设备上中断。请使用 Environment.getExternalStorageDirectory()

关于android - 为什么在 list 中使用 min-sdk 标签时位于 sdcard 上的 sqlite 数据库只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287819/

相关文章:

android - "android.net.conn.CONNECTIVITY_CHANGE"在Android 7.0及以上版本对应的 Action 是什么?

android - 上传 Google Drive API Retrofit 2

java - 当我从另一 Activity 获取结果时,ListView 仅更新一个 View 项,如何获取所有过去的结果?

java - 模块中的不同 Google Play 服务

android - 部署后缺少应用程序启动器

list 中的android anydensity

android - SYSTEM_ALERT_WINDOW 的运行时权限

android - Kotlin Android 与 Kotlin 多平台

android - Android Studio : White Space Formatting Strategy Factory error

android - MainActivity NoClassDefFoundError