捆绑 Realm 文件 - .NET SDK
您可能希望在移动应用程序中播种一些初始数据,这些数据将在应用程序首次启动时提供给用户。 为此,您需要:
构建一个临时 Realm 应用程序,
复制现有 Realm(仅包含要捆绑的数据),然后
将Realm 文件捆绑到应用程序的共享项目中。
在生产应用程序(首次加载时使用此捆绑 Realm 的应用程序)中,您添加几行代码来提取 Realm 并将其保存在应用程序数据中。 以下部分提供了有关这些步骤的更多信息。
重要
捆绑同步 Realm
如果您的后端应用程序使用 Flexible Sync ,则用户在首次打开捆绑域文件时可能会遇到客户端重置的情况。 启用客户端最大离线时间(默认启用客户端最大离线客户端)时,可能会出现这种情况。 如果在用户首次同步之前生成捆绑域文件的时间超过了客户端最大离线时间设置指定的天数,则用户会遇到客户端重置。
执行客户端重置的应用程序会从应用程序后端下载 Realm 的完整状态。 这抵消了捆绑 Realm 文件的优势。 为防止客户端重置并保留 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; // 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 配置。 您不能使用此方法在基于分区的同步 Realm 和 Flexible Sync Realm 之间进行转换,反之亦然。
在生产应用程序中捆绑 Realm 文件
现在您已经拥有了包含“种子”数据的域副本,您需要将其与生产应用程序捆绑在一起。捆绑过程取决于您构建的是移动应用程序还是 Unity 应用程序:
导航到为新 Realm 指定的路径,然后将新创建的 Realm 文件拖到 Visual Studio 中的共享 MAUI/Xamarin 项目中。
出现提示时,选择 Copy the file to the directory 。
在共享项目中,右键单击刚刚添加的 Realm 文件,选择Build Action ,然后选择EmbeddedResource 。
打开您的生产Unity项目。
在“项目”标签页中,将新的域文件复制到“资产”文件夹中。 应用可通过
Application.dataPath
属性使用此处存储的资产。
注意
跨平台兼容性
未加密的 Realm 文件是跨平台兼容的,因此您可以将该文件捆绑在共享项目中。
从捆绑的 Realm 文件中打开 Realm
现在您已拥有应用中包含的 Realm 副本,您需要添加代码来使用它。 您添加的代码取决于应用的类型:
在部署带有捆绑 域 的应用程序之前,您需要添加代码以从嵌入式资源中提取 域,将其保存到应用程序的数据位置,然后在应用程序中打开这个新 域。以下代码展示了如何在应用程序启动期间执行此操作。 请注意:
此代码仅在指定位置未找到 Realm 文件时运行(通常仅在初次使用应用时),并且
打开 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);