web-dev-qa-db-fra.com

Désactivation de la journalisation sqlite Write-Ahead dans Android Pie

Dans Android Pie, l'enregistrement par anticipation sqlite (WAL) a été activé par défaut. Cela provoque des erreurs pour mon code existant uniquement dans les périphériques Pie . Je ne parviens pas à désactiver WAL avec succès avec SQLiteDatabase.disableWriteAheadLogging() ou PRAGMA journal_mode en raison de la méthode utilisée pour accéder à la base de données. Je souhaite désactiver complètement WAL avec un paramètre Android appelé db_compatibility_wal_supported:

Compatibilité WAL (enregistrement anticipé) pour applications

Est-ce que quelqu'un sait comment configurer cela? Je ne sais pas si ce fichier peut être modifié par programme au démarrage ou s'il est modifié manuellement.


Autres détails sur le problème

J'ai une base de données sqlite (20mb +/250k enregistrements) dans mon application. Cette base de données est générée à l'aide de Java pur sur mon serveur. Il contient une base de données d'aliments et l'utilisateur de l'application peut ajouter à la base de données (et le serveur est mis à jour). Celui-ci est stocké dans le dossier des actifs sous Android . Lors de la première installation, la base de données est copiée dans le dossier de l'application pour pouvoir y être écrite, en utilisant cette méthode:

Copier la base de données SQLite à partir du dossier assets

Malheureusement, une fois que je commence à écrire dans la base de données à l'aide de SqlDroid, la fonction est activée et les tables qui se trouvaient dans la base de données d'origine ont disparu et seules les tables nouvellement créées restent. La taille de la base de données reste toutefois de 20 Mo +. Toutes les erreurs de base de données sont dues aux tables manquantes .. La méthode de copie et d'écriture de table fonctionne parfaitement dans les versions d'Android antérieures à Pie.

4
Rockvole

J'ai finalement trouvé la réponse. Il semble que les erreurs de base de données que je recevais ne soient pas directement liées à WAL. C'est parce que le code largement utilisé pour copier une base de données à partir d'actifs contient un bogue dans lequel la base de données est laissée ouverte pendant la copie. Cela ne fait que commencer à causer un problème dans Android P . La solution consiste à fermer la base de données après avoir obtenu le nom du fichier de base de données.

SQLiteDatabase destinationDatabase = sqLiteOpenHelper.getWritableDatabase();
String dbFileName=destinationDatabase.getPath();
destinationDatabase.close();
// Now write the destinationDatabase using the dbFileName

C’est plus détaillé ici: Android P - 'SQLite: Aucune erreur de table' après la copie de la base de données à partir d’actifs

0
Rockvole

@Rockvole s'il vous plaît partager l'erreur que vous rencontrez, qui nous aident à trouver une solution appropriée.

En attendant, je comprends que vous souhaitiez fermer ce fichierWALdans Android Pie et que vous utilisez la librairie "SQLDroid" pour créer Sqlite DB. 

Cette lib en interne utilisant " SQLiteDatabase " pour stocker des données localement, je pense que vous devez appeler la classe " SQLiteDatabase.disableWriteAheadLogging () " in " SQLiteDatabase " où l'instance de base de données a créé le nom du package "package org.sqldroid;

ouObtenez une instance interne de SQLiteDatabaseet appelez disableWriteAheadLogging ().

La deuxième solution est de créer "config.xml" dans le dossier de valeurs et de wirte "<bool name="db_compatibility_wal_supported">false</bool>", puis de l’exécuter et de vérifier son fonctionnement.

1
Parkash

on ne peut pas utiliser SQLDroidDriver.ADDITONAL_DATABASE_FLAGS, simplement parce qu'il n'y a pas de constante disponible, ce qui annulerait l'indicateur ENABLE_WRITE_AHEAD_LOGGING.

WAL peut toujours être désactivé en créant l'un ou l'autre de ces scénarios:

a) mettre l'indicateur OPEN_READONLY (s'applique aux situations où l'accès R/O suffit).

b) exécuter PRAGMA journal_mode=DELETE en tant que première requête, afin de remplacer PRAGMA journal_mode=WAL.

c) créez un problème contre SQLDroidConnection.Java , afin que .enableWriteAheadLogging() et .disableWriteAheadLogging() soient pris en charge au niveau du pilote.

0
Martin Zeitler

Le moyen le plus simple et le plus simple de désactiver le mode WAL dans votre base de données est le suivant:

public class MyDbHelper extends SQLiteOpenHelper {

    //...

    @Override
    public void onOpen(SQLiteDatabase db) {
        db.disableWriteAheadLogging();  // Here the solution
        super.onOpen(db);
    }

    //...
}

De cette façon, tous les accès à votre base de données seront avec le mode WAL désactivé. Autant que vous ouvrez et fermez plusieurs connexions tout au long de la mise en œuvre de votre application

0
Carlos Henrique