3 votes

Résoudre le problème "android.process.acore s'arrête de façon inattendue" lorsque le fournisseur de contacts ne parvient pas à charger sa base de données.

Mon téléphone vient de décider qu'il devrait spammer une exception sur mon écran qui se réouvre dès que je la tape.

Un examen de logcat révèle ce qui suit lancé plusieurs fois par seconde:

SQLiteLog: (14) cannot open file at line 34327 of [605907e73a]
SQLiteLog: (14) os_unix.c:34327: (13) open(/data/user/0/com.android.providers.contacts/databases/contacts2.db-shm) -
SQLiteLog: (14) statement aborts at 1: [PRAGMA user_version;] unable to open database file
SQLiteLog: (14) cannot open file at line 34327 of [605907e73a]
SQLiteLog: (14) os_unix.c:34327: (13) open(/data/user/0/com.android.providers.contacts/databases/contacts2.db-shm) -
AndroidRuntime: FATAL EXCEPTION: Worker-1
AndroidRuntime: Process: android.process.acore, PID: 9149
AndroidRuntime: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
AndroidRuntime:        at android.database.sqlite.SQLiteConnection.nativeExecuteForLong(Native Method)
AndroidRuntime:        at android.database.sqlite.SQLiteConnection.executeForLong(SQLiteConnection.java:599)
AndroidRuntime:        at android.database.sqlite.SQLiteSession.executeForLong(SQLiteSession.java:652)
AndroidRuntime:        at android.database.sqlite.SQLiteStatement.simpleQueryForLong(SQLiteStatement.java:107)
AndroidRuntime:        at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:842)
AndroidRuntime:        at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:830)
AndroidRuntime:        at android.database.sqlite.SQLiteDatabase.getVersion(SQLiteDatabase.java:940)
AndroidRuntime:        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:311)
AndroidRuntime:        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:262)
AndroidRuntime:        at com.android.providers.contacts.LegacyApiSupport.(LegacyApiSupport.java:499)
AndroidRuntime:        at com.android.providers.contacts.ContactsProvider2.initForDefaultLocale(ContactsProvider2.java:1668)
AndroidRuntime:        at com.android.providers.contacts.ContactsProvider2.performBackgroundTask(ContactsProvider2.java:1759)
AndroidRuntime:        at com.android.providers.contacts.ContactsProvider2$1.onPerformTask(ContactsProvider2.java:1615)
AndroidRuntime:        at com.android.providers.contacts.ContactsTaskScheduler$MyHandler.handleMessage(ContactsTaskScheduler.java:77)
AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:106)
AndroidRuntime:        at android.os.Looper.loop(Looper.java:164)
AndroidRuntime:        at android.os.HandlerThread.run(HandlerThread.java:65)

Ma supposition serait que - pour une raison quelconque - le fournisseur de contacts a été affecté à un ID d'utilisateur différent et a maintenant perdu l'accès à sa propre base de données. Je supposerais que si je nettoie la base de données, le problème disparaît.

Cependant, je ne veux pas perdre mes contacts. J'ai une sauvegarde mais elle est assez ancienne pour dire que j'en perdrais certains. Je suis convaincu que le fichier est toujours là et que je peux probablement l'ouvrir comme fichier sqlite une fois que j'ai accès, mais je n'ai aucune idée de comment y parvenir. Essayer de travailler avec le paquet com.android.providers.contacts dans adb me laisse toujours avec "package not debuggable".

Mon téléphone est un Moto G5 Plus non rooté fonctionnant sous Android 8.1

Y a-t-il un moyen de sauvegarder mes contacts ou sont-ils perdus? Aussi: Puis-je peut-être simplement supprimer le fichier *.db-shm qui semble être le problème ici? Autant que je me souvienne, c'est juste un fichier temporaire pour sqlite de toute façon.

1voto

Link64 Points 131

J'ai posté cette question en essayant de trouver une solution pendant environ une heure et seulement 10 minutes plus tard, je l'ai enfin trouvée moi-même.

En entrant dans le adb shell et en exécutant

pm clear com.android.providers.contacts

ne nécessite pas de privilèges root et efface le cache, qui semble inclure le fichier *.db-shm.

Je garde cette question ici pour référence future

EDIT: C'était une désinformation. Après vérification, j'ai découvert que pm clear efface en fait toutes les données de l'application, donc ne l'exécutez pas si vous voulez simplement effacer le cache d'une application. Cette commande est essentiellement la même que cliquer sur le bouton Effacer les données dans les préférences de l'application.

La raison pour laquelle cela a fonctionné pour moi est que les contacts eux-mêmes sont stockés séparément. Le package com.android.providers.contacts charge les contacts à partir de cet autre endroit et les fournit à d'autres applications, c'est pourquoi il est appelé fournisseur de contacts.

Les données dans la base de données du fournisseur semblent être uniquement des choses comme le journal des appels et les contacts avec lesquels vous avez récemment partagé quelque chose. Supprimer ces données est tout à fait normal et résout le problème.

0 votes

Il est permis de répondre à sa propre question.

0 votes

@ReddyLutonadio Je sais, c'est pourquoi je l'ai fait. En tant qu'utilisateur de stackoverflow, je déteste quand je trouve mon problème exact dans une question sans réponse. Je me demande toujours si les gens ont abandonné ou n'ont pas pris la peine de fournir une solution lorsqu'ils l'ont trouvée.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X