Realm 파일 번들 - .NET SDK
앱을 처음 실행할 때 사용자가 사용할 수 있는 일부 초기 데이터를 모바일 앱에 시드할 수 있습니다. 이렇게 하려면 다음을 수행합니다.
임시 Realm 앱 빌드
기존 영역의 복사본을 만들고(묶고 싶은 데이터만 포함)
앱의 공유 프로젝트에 Realm 파일 을 번들로 제공합니다.
프로덕션 앱(처음 로드할 때 이 번들 영역을 사용하는 앱)에서 몇 줄의 코드를 추가하여 영역을 추출하고 앱 데이터에 저장합니다. 다음 섹션에서 이러한 단계에 대한 자세한 내용을 확인할 수 있습니다.
중요
동기화된 Realm 번들
백엔드 애플리케이션 에서 Flexible Sync 를 사용하는 경우 사용자가 번들 영역 파일 을 처음 열 때 클라이언트 재설정 을 경험할 수 있습니다. 이는 클라이언트 최대 오프라인 시간 이 활성화된 경우(클라이언트 최대 오프라인 시간은 기본값 활성화되어 있음) 발생할 수 있습니다. 사용자가 처음 동기화하기 전에 번들 영역 파일 이 클라이언트 최대 오프라인 시간 설정에 지정된 일수보다 오래 생성된 경우 사용자는 클라이언트 재설정 을 경험하게 됩니다.
클라이언트 재설정을 수행하는 애플리케이션은 애플리케이션 백엔드에서 영역의 전체 상태를 다운로드합니다. 이렇게 하면 Realm 파일을 번들로 제공할 때 얻을 수 있는 이점이 무효화됩니다. 클라이언트 재설정을 방지하고 Realm 파일 번들의 이점을 보존하려면 다음을 수행합니다.
동기화된 영역을 번들로 제공하는 애플리케이션에서는 클라이언트 최대 오프라인 시간을 사용하지 않도록 합니다.
애플리케이션에서 클라이언트 최대 오프라인 시간을 사용하는 경우 애플리케이션 다운로드에 항상 최근에 동기화된 Realm 파일이 포함되어 있는지 확인하세요. 각 애플리케이션 버전마다 새 파일을 생성하고 클라이언트 최대 오프라인 시간 (일)을 초과하는 버전이 최신 상태로 유지되지 않도록 합니다.
번들링을 위한 Realm 파일 만들기
프로덕션 앱과 동일한 Realm 데이터 모델을 사용하여 새 프로젝트를 생성합니다. 번들로 만들 데이터가 있는 기존 Realm을 열거나 새 Realm을 만듭니다.
WriteCopy() 메서드를 사용하여 영역 의 복사본을 새 위치 및/또는 이름으로 만듭니다. 다음 코드는 이를 보여줍니다.
// open an existing realm var realm = Realm.GetInstance("myRealm.realm"); // Create a RealmConfiguration for the *copy* var config = new RealmConfiguration("bundled.realm"); // Make sure the file doesn't already exist Realm.DeleteRealm(config); // Copy the realm realm.WriteCopy(config); // Want to know where the copy is? var locationOfCopy = config.DatabasePath; 중요
동기화된 Realm 복사
동기화된 영역 을 복사할 때는 보류 중인 동기화 프로세스가 없는지 확인해야 합니다. WaitForUploadAsync 및 WaitForDownloadAsync를 호출하면 됩니다.
// open an existing realm var existingConfig = new PartitionSyncConfiguration("myPartition", user); var realm = await Realm.GetInstanceAsync(existingConfig); // Create a RealmConfiguration for the *copy* // Be sure the partition name matches the original var bundledConfig = new PartitionSyncConfiguration("myPartition", user, "bundled.realm"); // Make sure the file doesn't already exist Realm.DeleteRealm(bundledConfig); // IMPORTANT: When copying a Synced realm, you must ensure // that there are no pending Sync operations. You do this // by calling WaitForUploadAsync() and WaitForDownloadAsync(): var session = realm.SyncSession; await session.WaitForUploadAsync(); await session.WaitForDownloadAsync(); // Copy the realm realm.WriteCopy(bundledConfig); // Want to know where the copy is? var locationOfCopy = existingConfig.DatabasePath; 참고
동일 유형 동기화만 가능
이 방법은 다른 파티션 기반 동기화 사용자를 위한 파티션 기반 동기화 구성 복사 또는 다른 Flexible Sync 사용자를 위한 Flexible Sync 구성 복사만 지원합니다. 이 방법을 사용하여 파티션 기반 동기화 영역과 Flexible Sync 영역 간에 또는 그 반대로 변환할 수 없습니다.
프로덕션 애플리케이션에 Realm 파일 번들
이제 '시드' 데이터가 포함된 영역의 복사본이 있으므로 이를 프로덕션 애플리케이션과 번들로 묶어야 합니다. 번들 프로세스는 모바일 앱을 빌드하는지, 아니면 Unity 앱을 빌드하는지에 따라 다릅니다.
새 영역에 지정한 경로로 이동한 다음, 새로 만든 Realm 파일을 Visual Studio의 공유 Maui/Xamarin 프로젝트로 끌어옵니다.
메시지가 표시되면 Copy the file to the directory 을 선택합니다.
공유 프로젝트에서 방금 추가한 Realm 파일을 마우스 오른쪽 버튼으로 클릭하고 Build Action 을 선택한 다음 EmbeddedResource 을 선택합니다.
프로덕션 Unity 프로젝트 를 엽니다.
프로젝트 탭 에서 새 영역 파일 을 자산 폴더에 복사합니다. 여기에 저장된 자산은
Application.dataPath
속성 을 통해 앱 에서 사용할 수 있습니다.
참고
크로스 플랫폼 호환성
암호화되지 않은 영역 파일은 크로스 플랫폼과 호환되므로 공유 프로젝트에서 파일을 번들로 사용할 수 있습니다.
번들 Realm 파일에서 Realm 열기
이제 앱에 포함된 영역의 복사본이 있으므로 이를 사용하려면 코드를 추가해야 합니다. 추가하는 코드는 앱 유형에 따라 다릅니다.
번들 영역으로 앱을 배포하기 전에 임베디드 리소스에서 영역을 추출하는 코드를 추가하고 앱의 데이터 위치에 저장한 다음 앱에서 이 새 영역을 열어야 합니다. 다음 코드는 앱을 시작하는 동안 이 작업을 수행하는 방법을 보여줍니다. 참고 사항:
이 코드는 지정된 위치에서 영역 파일을 찾을 수 없는 경우에만 실행됩니다(일반적으로 앱을 처음 사용할 때만 해당).
영역을 여는 방법은 동기화된 영역으로 작업하는지 여부에 따라 달라집니다. 자세한 내용은 동기화 없이 Realm 열기를 참조하세요.
// If you are using a local realm var config = RealmConfiguration.DefaultConfiguration; // If the realm file is a synced realm var app = App.Create(Config.AppId); var user = await app.LogInAsync(Credentials.Anonymous()); config = new PartitionSyncConfiguration("myPartition", user); // Extract and copy the realm if (!File.Exists(config.DatabasePath)) { using var bundledDbStream = Assembly.GetExecutingAssembly() .GetManifestResourceStream("bundled.realm"); using var databaseFile = File.Create(config.DatabasePath); bundledDbStream!.CopyTo(databaseFile); } // Open the Realm: var realm = Realm.GetInstance(config);
임베디드 Realm은 Unity 프로젝트의 다른 Realm과 마찬가지로 초기화됩니다.
// After copying the above created file to the project folder, // we can access it in Application.dataPath // If you are using a local realm var config = RealmConfiguration.DefaultConfiguration; // If the realm is synced realm var app = App.Create("myRealmAppId"); var user = await app.LogInAsync(Credentials.Anonymous()); config = new PartitionSyncConfiguration("myPartition", user); if (!File.Exists(config.DatabasePath)) FileUtil.CopyFileOrDirectory(Path.Combine(Application.dataPath, "bundled.realm"), config.DatabasePath); } var realm = Realm.GetInstance(config);