문서 메뉴

문서 홈애플리케이션 개발Atlas Device SDK

Realm 번들 - Flutter SDK

이 페이지의 내용

  • 로컬 Realm 번들
  • 번들링을 위한 Realm 파일 만들기
  • 프로덕션 애플리케이션에 Realm 파일 번들
  • 번들 Realm 파일에서 Realm 열기
  • 동기화된 Realm 번들

앱을 처음 실행할 때 사용자가 사용할 수 있는 일부 초기 데이터를 모바일 앱에 시드할 수 있습니다. 이를 위해 Flutter 앱에서 기존 Realm 파일을 번들로 제공할 수 있습니다.

앱에서 동기화된 Realm을 사용하는 경우 번들로 제공하지 않는 것이 좋습니다. 자세한 내용 은 동기화된 Realm 번들 섹션을 참조하세요.

초기 데이터 콜백 고려

1

프로덕션 앱과 동일한 Realm 객체 스키마 를 사용하여 새 프로젝트를 생성합니다. 번들로 만들 데이터가 있는 기존 Realm 을 열거나 새 Realm을 만듭니다.

Realm.config.path 를 사용하여 Realm 파일의 경로를 가져옵니다. 속성.

print("Bundling realm");
final config = Configuration.local([Car.schema], path: 'bundle.realm');
final realm = Realm(config);
realm.write(() {
realm.add(Car(ObjectId(), "Audi", model: 'A8'));
realm.add(Car(ObjectId(), "Mercedes", model: 'G Wagon'));
});
print("Bundled realm location: " + realm.config.path);
realm.close();

Dart 독립형 SDK로 번들 Realm 만들기

다음과 같은 이유로 Dart 독립형 SDK 를 사용하여 Flutter 애플리케이션을 위한 번들 영역을 생성해야 할 수 있습니다.

  • 번들 영역을 만드는 데 Flutter UI 요소가 필요하지 않습니다.

  • Dart 독립형 프로젝트는 Flutter 프로젝트보다 상용구 코드가 덜 필요합니다.

2

이제 '시드' 데이터가 포함된 영역의 복사본이 있으므로 이를 프로덕션 애플리케이션과 번들로 묶어야 합니다.

애플리케이션의 Flutter 자산 에 Realm 파일 추가 . 예를 들어 프로젝트의 위치에 번들 Realm을 추가할 수 assets/bundled.realm 있습니다.

번들 영역에 대한 참고를 pubspec.yaml 파일에 추가하여 프로덕션 애플리케이션에 포함합니다.

pubspec.yaml
flutter:
assets:
- realm/bundle.realm
3

이제 앱에 포함된 영역의 복사본이 있으므로 이를 사용하려면 코드를 추가해야 합니다.

번들로 제공되는 영역으로 앱을 배포하기 전에 내장된 리소스에서 영역을 추출하고 앱의 데이터 위치에 저장한 다음 앱에서 이 새 영역을 열어야 합니다. 다음 코드는 앱을 시작하는 동안 이 작업을 수행하는 방법을 보여줍니다.

헬퍼 함수 를 만들어 initBundledRealm 번들 Realm이 앱 내에 이미 존재하는지 확인하고, 아직 존재하지 않으면 앱에 로드합니다. runApp()initBundledRealm 으로앱의 위젯 로드를 호출하기 전에 를 호출합니다.

lib/main.dart
// Also import Realm schema and Flutter widgets
import 'package:flutter/services.dart';
import 'package:realm/realm.dart';
import 'dart:io';
Future<Realm> initBundledRealm(String assetKey) async {
final config = Configuration.local([Car.schema]);
final file = File(config.path);
if (!await file.exists()) {
final realmBytes = await rootBundle.load(assetKey);
await file.writeAsBytes(
realmBytes.buffer
.asUint8List(realmBytes.offsetInBytes, realmBytes.lengthInBytes),
mode: FileMode.write);
}
return Realm(config);
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final realm = await initBundledRealm("assets/bundle.realm");
runApp(const MyApp());
}

대부분의 경우 동기화된 Realm을 번들로 묶어서는 됩니다. 번들 Realm이 클라이언트 최대 오프라인 시간 보다 더 과거에 마지막으로 업데이트된 경우 사용자는 번들 Realm 파일을 처음 열 때 클라이언트 재설정을 경험하게 됩니다. 클라이언트 재설정을 수행하면 애플리케이션이 애플리케이션 백엔드에서 영역의 전체 상태를 다운로드합니다. 이렇게 하면 Realm 파일을 번들로 제공할 때 얻을 수 있는 이점이 무효화됩니다.

동기화된 Realm을 번들로 제공하는 대신 동기화 구독을 사용하여 애플리케이션을 데이터로 채울 수 있습니다. 동기화 구독을 사용하여 데이터를 추가하는 경우 Flexible Sync의 트리밍 기능을 활용하면서 데이터가 클라이언트 최대 온라인 시간보다 오래된 데이터를 걱정할 필요가 없습니다. 동기화 구독 사용에 대해 자세히 알아보려면 동기화 구독 관리를 참조하세요.

사용 사례가 다음 기준을 충족하는 경우에만 동기화 Realm을 번들로 묶어야 합니다.

  • 클라이언트 최대 오프라인 시간보다 최근에 생성된 번들 동기화 영역이 있는 앱 버전이 사용자에게 있는지 확인할 수 있습니다.

  • 초기 번들 데이터가 매우 크고 인터넷 대역폭이 제한된 상황에서 앱을 사용하고 있기 때문에 동기화 구독을 사용한 초기 데이터 다운로드는 시간이 너무 오래 걸립니다.

  • 모든 앱 사용자는 번들에 포함된 데이터를 볼 수 있는 백엔드 권한이 있습니다. 사용자에게 이 데이터를 볼 수 있는 권한이 없는 경우 영역이 Atlas와 동기화될 때 보상 쓰기 오류를 통해 해당 데이터가 장치에서 제거됩니다.

동기화 영역을 번들로 구성하려면 다음을 수행합니다.

  1. App Services App에 연결하고 사용자를 인증합니다.

  2. Realm에 구독을 추가합니다. 동기화된 Realm에 쓰려면 구독이 필요합니다.

  3. 동기화된 영역에 데이터를 추가합니다.

  4. 모든 로컬 변경 사항이 Realm Mobile Sync 서버와 동기화될 때까지 기다립니다.

  5. Realm.writeCopy() 사용 동기화된 Realm의 새 버전을 만듭니다. 이 메서드는 Realm을 Realm.writeCopy() 사용자와 연결하는 메타데이터를 제거하여 다른 사용자가 Realm 파일을 열 수 있도록 하기 때문에 를 사용하여 동기화된 Realm을 번들로 제공해야 합니다.

print("Bundling synced realm");
// You must connect to the Device Sync server with an authenticated
// user to work with the synced realm.
final app = App(AppConfiguration(APP_ID));
// Check if current user exists and log anonymous user if not.
final user = app.currentUser ?? await app.logIn(Credentials.anonymous());
final config = Configuration.flexibleSync(user, [Car.schema]);
final realm = Realm(config);
// Add subscription that match the data being added
// and your app's backend permissions.
realm.subscriptions.update((mutableSubscriptions) {
mutableSubscriptions.add(realm.all<Car>());
});
await realm.subscriptions.waitForSynchronization();
// Add data to realm
realm.write(() {
realm.add(Car(ObjectId(), "Audi", model: 'A8'));
realm.add(Car(ObjectId(), "Mercedes", model: 'G Wagon'));
});
// Sync changes with the server
await realm.syncSession.waitForUpload();
await realm.syncSession.waitForDownload();
// Create new configuration for the bundled realm.
// You must specify a path separate from the realm you
// are copying for Realm.writeCopy() to succeed.
final bundledConfig = Configuration.flexibleSync(user, [Car.schema],
path: 'sync_bundle.realm');
realm.writeCopy(bundledConfig);
print("Bundled realm location: " + bundledConfig.path);
realm.close();

번들 영역을 생성한 후 위 의 프로덕션 애플리케이션에서 Realm File 번들번들 Realm 파일에서 Realm 열기 섹션의 지침을 따르세요.

← Realm 파일 삭제 - Flutter SDK