2010-08-06 5 views
1
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(); 

erreurAndroid exception sqlite, comment réparer?

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

que vous mettez un verrou sur la base de données, je suppose que vous avez essayé d'y accéder à partir de 2 threads différents? – Sephy

+0

thx sephy, j'ai modifié ce bug – fonter

Répondre

1

du résultat Locat cela semble être là où le problème est le suivant:

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

si cela me fait penser sur les autorisations de fichiers, comme tout de suite quand j'ai commencé essayer de déboguer des trucs sur mon téléphone réel j'ai remarqué que le dossier/data n'était pas accessible dans le navigateur de fichiers se révèle si le téléphone n'est pas root c'est normal. Pour aller plus loin, je pense qu'il est possible que les programmes n'aient pas non plus accès à n'importe quoi dans le dossier/data, à l'exception du répertoire qui lui est propre. Donc, si votre paquet n'est pas nommé "com.android.browser", il ne sera probablement pas en mesure de lire ce dossier et donc essayer d'ouvrir des fichiers dans ce dossier échouerait. aussi pas tout à fait sûr si cela s'applique ici, mais j'ai également rencontré des cas où il échoue lorsque vous utilisez le chemin absolu, mais fonctionne lorsque vous utilisez le chemin relatif au même endroit. donc à cette fin, je dirais que l'aide

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

donc si votre forfait est nommé com.android.browser ma suggestion devrait débarquez dans le même endroit. Si ce n'est pas le cas, il est fort probable qu'il n'ait pas la permission d'accéder aux fichiers de cette autre application. Je pense qu'il est possible d'obtenir la permission, mais vous devez faire quelque chose pour les deux programmes pour leur permettre de partager des fichiers. J'ai lu quelque part que Android exécute normalement chaque application dans un espace séparé et il dit qu'il va jusqu'à utiliser des comptes Linux distincts pour chacun, étant donné que c'est sur ce système qu'O android est construit. Donc, si vous essayez de modifier les signets dans le navigateur intégré, je ne pense pas que vous pouvez modifier sa base de données directement, étant donné que vous ne pouvez pas modifier ce programme pour lui dire de partager ses fichiers avec votre programme; mais vous pouvez être en mesure d'envoyer des intentions à l'application et de le faire effectuer de cette façon.