Android sqlite исключение, как исправить? - PullRequest
1 голос
/ 06 августа 2010
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();

ошибка

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)

1 Ответ

1 голос
/ 27 февраля 2012

из результата поиска, похоже, проблема в этом:

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

, так что это заставляет меня задуматься о правах доступа к файлам, так как сразу, когда я начал пытаться отлаживать что-то на моем реальном телефоне, я заметил, что папка / data была недоступна в файловом браузере, и выясняется, что если телефон не рутирован нормальный. давайте сделаем еще один шаг, я думаю, что программы также не имеют доступа ни к чему в папке / data, за исключением одного каталога, предназначенного для собственных целей. так что если ваш пакет не называется com.android.browser, он, скорее всего, не сможет прочитать эту папку, и, следовательно, попытка открыть файлы в ней не удастся. также не совсем уверен, применимо ли это здесь, но я также сталкивался со случаями, когда он терпит неудачу, когда вы используете абсолютный путь, но работает, когда вы используете относительный путь к тому же местоположению. так что для этого я бы сказал, используя

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

поэтому, если ваш пакет называется com.android.browser, мое предложение должно поставить его в то же место. если это не так, вполне вероятно, что у него нет прав доступа к файлам этого другого приложения. Я думаю, что можно получить разрешение, но вы должны сделать что-то для обеих программ, чтобы они могли обмениваться файлами. Я где-то читал, что Android обычно запускает каждое приложение в отдельном пространстве, и он говорит, что он использует отдельные учетные записи Linux для каждой, то есть для этого и создан Android OS.

так что, если вы пытаетесь редактировать закладки во встроенном браузере, я не думаю, что вы можете изменить его базу данных напрямую, поскольку вы не можете изменить эту программу, чтобы сообщить ей об обмене файлами с вашей программой; но вы можете отправить намерения в приложение и заставить его выполнять их таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...