1 votos

Android cree que accounts.db está dañado y lo borra

Después de un reinicio, perdí todas mis cuentas. miré en el logcat y obtuve:

04-02 11:54:01.535  5305  8068 E SQLiteLog: (11) statement aborts at 24: [SELECT key, value FROM extras WHERE accounts_id=(select _id FROM accounts WHERE name=? AND type=?)] database disk image is malformed
04-02 11:54:01.537  5305  8068 E DefaultDatabaseErrorHandler: Corruption reported by sqlite on database: /data/system/users/0/accounts.db
04-02 11:54:01.538  5305  8068 E DefaultDatabaseErrorHandler: deleting the database file: /data/system/users/0/accounts.db

He restaurado el archivo completamente desde un archivo XML de TitaniumBackup (por lo que la base de datos se crea de nuevo de forma limpia, sin copia de seguridad de un posible archivo db corrupto). Tras un reinicio, Android lo borra de nuevo y lo vuelve a crear, al acceder a él justo después de la restauración (es decir, utilizando un programa, que busca una cuenta) da el mensaje

04-02 11:45:22.855 12225 12225 W System.err: Caused by: java.lang.IllegalStateException: The database '/data/system/users/0/accounts.db' is not open.

justo después de la restauración, puedo abrir mi accounts.db con sqlite3 y SELECT * FROM ACCOUNTS devuelve una lista correcta y SELECT key, value FROM extras también funciona como se esperaba.

Los permisos de los archivos son

-rw-rw---- 1 system system  72K 2017-04-02 11:55 accounts.db
-rw------- 1 system system  17K 2017-04-02 11:55 accounts.db-journal

Mi ROM es CyanogenMod 13.

1voto

Nick Veitch Puntos 518

Lo he arreglado, aunque no entienda lo que ha pasado

He comprobado el archivo sqlite creado con PRAGMA integrity_check; Y después de reindexar y vaciar me sale un mensaje de que está corrupto (antes no).

He intentado recrearlo como en este blogpost y establecer los permisos de los archivos, lo que provocó un bucle de arranque.

Entonces reinicié a la recuperación y reemplazó el accounts.db con una vacía de una segunda cuenta en el teléfono y luego leer el dump_all.sql creado antes en la base de datos.

Ahora funciona, incluso cuando no sé cuál es la diferencia entre la lectura de los datos en una base de datos fresca (que causó un bootloop) y la lectura en una base de datos vacía creada por Android. Puede estar relacionado con la falta de contextos de selinux o algo similar.

Así que los pasos de trabajo para cualquier persona con un problema similar:

  • volcar los datos de la base de datos posiblemente rota (incluso cuando está recién creada por TitaniumBackup)
  • copiar una base de datos vacía
  • importar los datos a la db
  • reiniciar

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X