2017-03-17 7 views
1

React Native에서, (이주를 무시하고) 영역 데이터베이스를 삭제하고 한번만 실행하는 마이그레이션 코드 또는 코드를 어디에 넣어야합니까?React Native Realm Migration

로그인 화면으로 돌아갈 때마다 영역 데이터베이스를 삭제하려고했습니다. 로그인을 시도하면 사용자 정보를 영역으로 저장 한 다음 앱이 정상적으로 진행됩니다. 그러나 이것이 사실이 아니며, 영역 데이터베이스가 삭제 되었기 때문에 보이는 것입니다. 저장하지 않아도됩니다. 나는 일단 사용자 정보를 영역에 저장하여 로그인하면 Realm을 초기화 한 다음 사용자를 영역에 저장한다고 생각했을 것입니다.

디버그 모드에서는 영역 데이터베이스를 삭제해도 모든 것이 정상적으로 작동합니다. 디버그 모드가 훨씬 느려지므로 어딘가에 타이밍 문제가 있습니까?

영역을 초기화하는 방법이 있습니까?

+0

렐름과 동기화 (렐름 모바일 플랫폼)를 사용하고 있습니까? 아니면 사용자가 자신을 추적하고있는 것입니까? 일반적으로 영역 파일을 캐싱 등에 사용하지 않는 한 항상 영역 파일을 삭제하지 않습니다. –

+0

저는 React Native 용 Realm javascript를 사용하고 있습니다. 내 문제는 스키마가 변경되면 마이그레이션을 어떻게 처리 할 수 ​​있는가하는 것입니다. 정확히 어디서 코드를 작성합니까? 항상 마이그레이션을 수행 할 필요는 없으며 영역을 삭제하고 다시 초기화하면 충분하지만 작동하지 않는 것 같습니다. 사용자가 상점에서 앱을 다운로드 한 후 다음 업데이트를 위해 스키마를 업데이트하면 어떻게됩니까? 다시 설치 한 후에 영역 데이터베이스가 제거됩니까? 그렇다면 작동 할 것입니다. 그렇지 않으면 문제가 될 것입니다. – fes

+0

설명서의 [migrations] (https://realm.io/docs/javascript/latest/#migrations) 섹션을 확인하십시오. 그게 도움이 되니? –

답변

2

이것은 이전 작업을 수행하기 위해 수행 한 작업입니다.

나는 /src에있는 realm.js에 있으며 모든 반응 파일을 보관합니다. 내 영역을 사용해야 할 때 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', 
    } 
}; 

참고로 이름은 같습니다. 그럼 난 export default new Realm({schema: [schema]});

을하는 데 사용 내 realm.js의 하단에있는 지금이있다 : 당신이 데이터를 마이그레이션 할 필요가없는 경우

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'; 
      } 
     } 
    }, 
}); 

, 당신은 새 스키마로 영역을 열 수 버전 및 새 스키마가 있어야하며 작동해야합니다.