React Native Realm Migration

В React Native, где вы должны поместить код миграции или код для удаления базы данных области (игнорируя миграцию) и для ее запуска только один раз?

Я пытался удалить базу данных Realm каждый раз, когда возвращался на экран входа в систему. Когда я пытаюсь войти в систему, предполагается, что информация о пользователе сохраняется в Realm, а затем приложение работает как обычно. Однако это не так, похоже, из-за того, что база данных Realm была удалена, ее некуда сохранить. Я бы подумал, что как только я войду в систему, сохранив информацию о пользователе в Realm, он инициализирует Realm, а затем сохранит пользователя в Realm.

В режиме отладки вроде даже удалив базу Realm, все нормально работает. Режим отладки намного медленнее, так что где-то есть проблема с синхронизацией?

Есть ли способ инициализировать Realm?


person fes    schedule 17.03.2017    source источник
comment
Используете ли вы Realm с синхронизацией (мобильная платформа Realm)? Или ваш пользователь - это то, что вы отслеживаете сами? Обычно вы не будете постоянно удалять файлы области, если только вы не используете их для кэширования или чего-то подобного.   -  person Kristian Dupont    schedule 20.03.2017
comment
Я просто использую javascript Realm для React Native. Моя проблема в том, что если схема изменится, как вы справляетесь с миграцией? Где именно вы размещаете код для него? Мне не всегда нужно выполнять миграцию, достаточно удалить область и повторно инициализировать, но, похоже, это не работает. Если пользователь загрузит приложение в магазине, а затем я обновлю схему для следующего обновления, что произойдет? Будет ли база данных Realm удалена после переустановки? Если так, то это сработает. Если нет, то будут проблемы.   -  person fes    schedule 21.03.2017
comment
Взгляните на раздел документации миграции. Вам это помогает?   -  person Kristian Dupont    schedule 21.03.2017


Ответы (2)


Это то, что я сделал, чтобы заставить миграцию работать.

У меня есть realm.js, расположенный в /src, где я храню все свои реагирующие файлы. Когда мне нужно использовать мою область, я import realm from 'path/to/realm.js'; В realm.js у меня есть моя старая схема и моя новая схема.

import Realm from 'realm';

const schema = {
    name: 'mySchema',
    properties: {
        name: 'string',
    }
};

const schemaV1 = {
    name: 'mySchema',
    properties: {
        name: 'string',
        otherName: 'string',
    }
};

Обратите внимание, что у них одинаковое имя. Затем в нижней части моего realm.js, где раньше был export default new Realm({schema: [schema]});

Теперь у меня есть это:

export default new Realm({
    schema: [schemaV1],
    schemaVersion: 1,
    migration: (oldRealm, newRealm) => {
        // only apply this change if upgrading to schemaVersion 1
        if (oldRealm.schemaVersion < 1) {
            const oldObjects = oldRealm.objects('schema');
            const newObjects = newRealm.objects('schema');

            // loop through all objects and set the name property in the new schema
            for (let i = 0; i < oldObjects.length; i++) {
                newObjects[i].otherName = 'otherName';
            }
        }
    },
});

Если вам не нужно переносить данные, вы можете просто открыть Realm с новой версией схемы и новой схемой, и это также должно работать.

person Syed Jafri    schedule 02.11.2017
comment
разве вы не получаете пустыми и oldRealm, и newRealm? - person Asbar Ali; 08.02.2019

Если вы только что добавили или удалили поля своей схемы, вы можете выполнить пустую миграцию. Это мой файл realm.js:

import Realm from 'realm';
//models
import Registros from '../models/registros';
import Local from '../models/local';

export default function getRealm() {

   return Realm.open({
      schema: [Registros, Local],
      schemaVersion: 1, //add a version number
      migration: (oldRealm, newRealm) => {

   },
});

}

person Pablo Ramon Prediger Garay    schedule 14.01.2020