在特定设备上无法打开ReadWirte数据库

时间:2014-03-08 10:03:49

标签: android sqlite

我只是尝试以READWRITE模式打开数据库。我收到以下错误:“没有错误(代码0):无法以读/写模式打开数据库。”以相同的方式打开数据库但READONLY是有效的。在我的3台设备上,这不是在READWRITE中打开的问题,但有2位用户报告了以下错误。

db存在于用户文件系统中。我用file.exists() - >检查这个。好。 db-file可以在用户设备上读写。我用file.canWrite()检查这个 - >确定。

dbfile存储在:

StoragePath:/mnt/extSdCard/mypath/mydb.db

2014年3月9日的新信息:这似乎只是KitKat 4.4.2中的一个问题。由于用户已更新到4.4.2,他们会遇到此问题。

我的代码:

public void onCreate(Bundle savedInstanceState) {


connectWriter(); // throws exception below.

public void connectWriter() {
        chronica_connection_readwrite = SQLiteDatabase.openDatabase("MyPath", null, SQLiteDatabase.OPEN_READWRITE);
        //chronica_connection_read.enableWriteAheadLogging();
    }

异常报告:

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: android.database.sqlite.SQLiteException: not an error (code 0): Could not open the database in read/write mode.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340)
at android.app.ActivityThread.access$800(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: not an error (code 0): Could not open the database in read/write mode.
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:342)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:232)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:515)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:207)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:891)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:859)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:671)
at myclass.connectWriter(ChronicBrowser.java:14286)
at myclass.LoadModule(ChronicBrowser.java:10792)
at myclass.onCreate(ChronicBrowser.java:761)
at android.app.Activity.performCreate(Activity.java:5389)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)


************ DEVICE INFORMATION ***********
Brand: samsung
Device: hlte
Model: SM-N9005
Id: KOT49H
Product: hltexx

************ FIRMWARE ************
SDK: 19
Release: 4.4.2
Incremental: N9005XXUENB7 

2 个答案:

答案 0 :(得分:2)

看起来这不是错误,而是“功能”。

Google's KitKat Blocks Some Access to Micro SD Cards

真的很难过,但看起来很真实

答案 1 :(得分:1)

我将首先说明你应该将SQLite数据库存储在内部存储上,在那里你可以获得ext4日记的系统来帮助进行数据恢复。内部存储上还有很多更好的安全性,因为您不必担心恶意应用程序会添加最终在您的流程中运行的触发器等。

总而言之,从KitKat开始,您可以通过新的公共API Context.getExternalFilesDirs()Context.getExternalCacheDirs()写入辅助存储设备。这些方法也可以在support-v4库中的ContextCompat上使用。

另请注意,如果您只对使用Context返回的目录感兴趣,则不再需要READ_WRITE_EXTERNAL_STORAGE权限。展望未来,您将始终拥有对这些目录的读/写权限,而无需其他权限。

应用还可以通过终止其权限请求继续使用旧设备:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />