[JAVA] ActiveAndroid => migration ReActiveAndroid

Lorsque j'ai essayé de publier une application et de définir targetSdkVersion sur 26, Active Android ne fonctionnait pas. Apparemment, cela ne fonctionne pas correctement car il n'est pas entretenu. https://www.tsurutan.com/entry/2018/10/08/Migration_ActiveAndroid_to_Room https://qiita.com/pside/items/03e6256b404c75f5974b#activeandroid%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%83%91%E3%82%B9%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AEreactiveandroid

Il existe une bonne quantité de descriptions existantes, et il était difficile de passer à une toute nouvelle bibliothèque, donc elle est tout à fait compatible. Migrer vers ReActive Android (Si c'est neuf, il y a plus de choix. Chambre, etc ...)

Ci-dessous le mémo correspondant à ce moment-là Je ne sais pas s'il y a une demande, mais si la même chose aide les gens en difficulté ...

Correspondance

Correspond selon le document suivant https://imangazalievm.gitbooks.io/reactiveandroid/migration-from-activeandroid.html

Le nom de la base de données et le nom de la table sont réécrits en tant que «DbName» et «TableName», respectivement.

--Dans build.gradle

implementation 'com.reactiveandroid:reactiveandroid:1.4.3'
implementation 'android.arch.persistence:db:1.1.1'

Ajoutée.

--Créez DbName.java et décrivez` @Database (name =" DbName ", version = 1) ʻet la méthode de migration suivante.

DbName.java


static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        // Since we didn't alter the table, there's nothing else to do here.
    }
};

--Appel depuis la partie d'initialisation d'App.java sous la forme suivante

App.java


        DatabaseConfig appDatabaseConfig = new DatabaseConfig.Builder(DbName.class)
                .addMigrations(DbName.MIGRATION_1_2)
                .build();

        ReActiveAndroid.init(new ReActiveConfig.Builder(this)
                .addDatabaseConfigs(appDatabaseConfig)
                .build());

--Supprimez toutes les instructions d'importation de ʻactiveandroid dans le code source et importez le reactiveandroid. Puisque la structure des répertoires n'a pas changé, vous devriez pouvoir remplacer ʻactiveandroid par reactiveandroid. --Ajoutez @PrimaryKey (name =" id ") à la clé primaire. --Changed Table annotation de chaque classe Model à @Table (name =" tableName ", database = DbName.class)

Comme ça ⬇︎

- new Select().from(TableName.class).where("Id = %d".format(id)).executeSingle[TableName]();
+ Select.from(TableName.class).where("Id = %d".format(id)).fetchSingle();
- ActiveAndroid.beginTransaction();
- ActiveAndroid.setTransactionSuccessful();
- ActiveAndroid.endTransaction();

+ ReActiveAndroid.getDatabase(DbName.class).beginTransaction();
+ ReActiveAndroid.getDatabase(DbName.class).getWritableDatabase().setTransactionSuccessful();
+ ReActiveAndroid.getDatabase(DbName.class).endTransaction();

Si vous faites jusqu'à présent, cela devrait fonctionner ...

Mémo où je me suis fait prendre

Si vous suivez la procédure ci-dessus, il ne devrait pas sortir.

Please provide a Migration

Please provide a Migration in the builder or call disableMigrationsChecking in the builder in which case ReActiveAndroid will re-create all of the tables.

Causé par l'oubli d'écrire le processus de migration

Ajouter et appeler la méthode de migration selon la procédure ci-dessus pour l'éliminer

SupportSQLiteDatabase n'est pas résolu

https://mvnrepository.com/artifact/android.arch.persistence/db Vérifiez la version avec

implementation 'android.arch.persistence.db:1.1.1'

Pour graduer >Error:Failed to resolve: android.arch.persistence.db:1.1.1: Erreur. >http://fengwanxingzhou.coding.me/Android%E9%94%99%E8%AF%AF/ Il semble que le nom du package soit spécifié de manière incorrecte. ʻAndroid.arch.persistence: db: 1.1.1` et il est passé.

Couldn't read row 0, col -1 from CursorWindow

Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

Dans ActiveAndroid, il peut être décrit sans utiliser le curseur, il doit donc être utilisé dans certains traitements internes.

Même si je regarde le traitement interne de la partie erreur (Select), je ne trouve pas l'endroit où le curseur est utilisé ... Utilisé à l'intérieur de fetchSingle (où la définition de Table est apportée). Quand j'ai mis un point d'arrêt ici, j'essayais de faire entrer une colonne où ʻidNameétait" _id ". La cause était que j'ai apporté le modèle tel quel et l'ai défini comme @PrimaryKey (name =" _ id "). (Le vrai nom de la colonne est ʻId) Alors

TableName.java


- @PrimaryKey(name = "_id")
+ @PrimaryKey(name = "Id")

Corrigé et résolu.

Recommended Posts

ActiveAndroid => migration ReActiveAndroid
Migration des rails