Android的SQLite的例外,如何解决?如何解决、Android、SQLite

2023-09-06 23:24:08 作者:高级将领

  SQLiteDatabase数据库= SQLiteDatabase.openDatabase(/数据/数据​​/ com.android.browser /数据库/ browser.db空,0);database.setLockingEnabled(真);database.delete(书签,_id = 2,NULL);database.close(); 

错误

  5月8日至6日:53:45.769:ERROR / TT(958):android.database.sqlite.SQLiteException:错误code 14:无法打开数据库文件五月八日至六日:53:45.769:ERROR / TT(958):在android.database.sqlite.SQLiteStatement.native_execute(本机方法)五月八日至六日:53:45.769:ERROR / TT(958):在android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:66)五月八日至六日:53:45.769:ERROR / TT(958):在android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1362)五月八日至六日:53:45.769:ERROR / TT(958):在com.iwidsets.sqlite.manager.SQLiteManager.onCreate(SQLiteManager.java:48)五月八日至六日:53:45.769:ERROR / TT(958):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)五月八日至六日:53:45.769:ERROR / TT(958):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)五月八日至六日:53:45.769:ERROR / TT(958):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)五月八日至六日:53:45.769:ERROR / TT(958):在android.app.ActivityThread.access $ 1800(ActivityThread.java:112)五月八日至六日:53:45.769:ERROR / TT(958):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1692)五月八日至六日:53:45.769:ERROR / TT(958):在android.os.Handler.dispatchMessage(Handler.java:99)五月八日至六日:53:45.769:ERROR / TT(958):在android.os.Looper.loop(Looper.java:123)五月八日至六日:53:45.769:ERROR / TT(958):在android.app.ActivityThread.main(ActivityThread.java:3948)五月八日至六日:53:45.769:ERROR / TT(958):在java.lang.reflect.Method.invokeNative(本机方法)五月八日至六日:53:45.769:ERROR / TT(958):在java.lang.reflect.Method.invoke(Method.java:521)五月八日至六日:53:45.769:ERROR / TT(958):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:782)五月八日至六日:53:45.769:ERROR / TT(958):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)五月八日至六日:53:45.769:ERROR / TT(958):在dalvik.system.NativeStart.main(本机方法) 

解决方案

从LOCAT结果这似乎是问题的所在:

SQLiteDatabase数据库= SQLiteDatabase.openDatabase(/数据/数据​​/ com.android.browser /数据库/ browser.db,NULL,0);

所以这让我思考有关文件权限,马上当我开始尝试调试东西,我实际的手机上,我注意到在/ data文件夹是无法访问的文件浏览器证明,如果手机的根源并非是那正常。让我们更进一步,我认为这是可能的,程序也没有一个能够获得除了一个目录是它自己的东西在/ data文件夹东西。所以如果你的包是不是名为com.android.browser以及它很可能会无法读取该文件夹,从而试图打开文件会失败。还没有完全确定这是否适用于这里,但是当你使用绝对路径在哪里失败,但是当你使用相对路径到相同位置的作品我也碰到的情况。所以为此我会说使用

SQLiteDatabase数据库= SQLiteDatabase.openDatabase(browser.db,NULL,0);

因此​​,如果你的包被命名为com.android.browser我的建议应该在同一地点花掉它。如果它不是那么它很有可能就没有权限到其他应用程序的文件。我认为这是可能获得权限,但你必须做一些事情来这两个方案,使他们能够共享文件。我读的地方,Android为正常运行在一个单独的空间每个应用和它说,它走得更远,使用独立的Linux占各自被这就是Android操作系统是建立在以。

所以如果你试图编辑在内置的浏览器,我不认为你可以修改它的数据库,直接,是因为你不能修改程序告诉它,分享它与您的程序文件的书签;但你可以将意向发送给应用程序,并把它执行出来的方式。

SQLiteDatabase database = SQLiteDatabase.openDatabase("/data/data/com.android.browser/databases/browser.db",
null, 0);
database.setLockingEnabled(true);

database.delete("bookmarks", "_id=2", null);
database.close();
Android SQLite详解

error

08-06 05:53:45.769: ERROR/tt(958): android.database.sqlite.SQLiteException: error code 14: unable to open database file
08-06 05:53:45.769: ERROR/tt(958):     at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
08-06 05:53:45.769: ERROR/tt(958):     at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:66)
08-06 05:53:45.769: ERROR/tt(958):     at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1362)
08-06 05:53:45.769: ERROR/tt(958):     at com.iwidsets.sqlite.manager.SQLiteManager.onCreate(SQLiteManager.java:48)
08-06 05:53:45.769: ERROR/tt(958):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
08-06 05:53:45.769: ERROR/tt(958):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
08-06 05:53:45.769: ERROR/tt(958):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
08-06 05:53:45.769: ERROR/tt(958):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
08-06 05:53:45.769: ERROR/tt(958):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
08-06 05:53:45.769: ERROR/tt(958):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-06 05:53:45.769: ERROR/tt(958):     at android.os.Looper.loop(Looper.java:123)
08-06 05:53:45.769: ERROR/tt(958):     at android.app.ActivityThread.main(ActivityThread.java:3948)
08-06 05:53:45.769: ERROR/tt(958):     at java.lang.reflect.Method.invokeNative(Native Method)
08-06 05:53:45.769: ERROR/tt(958):     at java.lang.reflect.Method.invoke(Method.java:521)
08-06 05:53:45.769: ERROR/tt(958):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
08-06 05:53:45.769: ERROR/tt(958):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
08-06 05:53:45.769: ERROR/tt(958):     at dalvik.system.NativeStart.main(Native Method)

解决方案

from the locat result this seems to be where the problem is:

SQLiteDatabase database = SQLiteDatabase.openDatabase("/data/data/com.android.browser/databases/browser.db", null, 0);

so this gets me thinking about file permissions, as right off when I started trying to debug stuff on my actual phone i noticed the /data folder wasn't accessible in the file browser turns out if the phone isn't rooted that's normal. lets take this a step further, I think it's possible that programs also do not a have access to anything in the /data folder except for the one directory that is for it's own stuff. so if your package is not named "com.android.browser" well it'll likely not be able to read that folder and thus trying to open files in it would fail. also not completely sure if this applies here but I've also run into cases where it fails when you use the absolute path but works when you use the relative path to the same location. so to that end I'd say using

SQLiteDatabase database = SQLiteDatabase.openDatabase("browser.db", null, 0);

so if your package is named com.android.browser my suggestion should plunk it in the same spot. if it's not then it's quite likely it doesn't have permission to that other app's files. I think it's possible to get the permission but you gotta do something to both program to enable them to share files. I did read somewhere that android does normally run each app in a separate space and it says it goes so far as using separate Linux accounts for each, being that is what android os is built on to.

so if your trying to edit the bookmarks in the built in browser i don't think you can modify it's database directly, being as you can't modify that program to tell it to share it's files with your program; but you may be able to send intents to the app and have it carry them out that way.