Arquivos Realm do pacote - .NET SDK
Nesta página
Talvez você queira semear seu aplicativo móvel com alguns dados iniciais que estarão disponíveis aos usuários no lançamento inicial do aplicativo. Para fazer isso, você:
Construa um aplicativo Realm temporário,
Faça uma cópia de um Realm existente (apenas com os dados que você deseja agrupar) e, em seguida,
Agrupe o Arquivo de Realm no projeto compartilhado do seu aplicativo.
Em seu aplicativo de produção (aquele que usará esse Realm agrupado no primeiro carregamento), adicione algumas linhas de código para extrair o Realm e salvá-lo nos dados do aplicativo. As seções a seguir fornecem mais informações sobre essas etapas.
Importante
Agrupar domínios sincronizados
Se o seu aplicação de backend usar Flexible Sync, os usuários poderão enfrentar um reinício do cliente na primeira vez que abrirem o arquivo de Realm agrupado. Isso pode ocorrer quando o tempo máximo offline do cliente está habilitado (o tempo máximo offline do cliente está habilitado por padrão). Se o arquivo de Realm agrupado tiver sido gerado mais do que o número de dias especificado pela configuração de tempo máximo offline do cliente antes de o usuário sincronizar pela primeira vez, o usuário experimenta uma reinício do cliente.
Os aplicativos que executam uma redefinição do cliente baixam o estado completo do domínio do backend do aplicativo. Isso nega as vantagens de agrupar um arquivo de domínio. Para evitar o reinício do cliente e preservar as vantagens do agrupamento de arquivos realm:
Evite usar o tempo offline máximo do cliente em aplicativos que agrupam um domínio sincronizado.
Se o seu aplicativo usar o tempo máximo offline do cliente, certifique-se de que o download do aplicativo sempre inclua um arquivo de domínio sincronizado recentemente. Gere um novo arquivo a cada versão do aplicativo e garanta que nenhuma versão permaneça atual por mais do que o número máximo de dias de tempo offline do cliente .
Criar um arquivo Realm para agrupamento
Crie um novo projeto com o mesmo Modelo de dados Realm como seu aplicativo de produção. Abra um Realm existente com os dados que você deseja agrupar ou crie um novo.
Use o método WriteCopy() para fazer uma cópia do Realm para um novo local e/ou nome. O seguinte código demonstra isso.
// 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; Importante
Copiando domínios sincronizados
Ao copiar um Realm sincronizado, você deve garantir que não haja processos de sincronização pendentes. Você faz isso chamando WaitForUploadAsync e 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; Observação
Somente sincronização do mesmo tipo
Esse método oferece suporte apenas à cópia de uma configuração de Partition-Based Sync para outro usuário de Partition-Based Sync ou uma configuração de Flexible Sync para outro usuário de Flexible Sync. Você não pode usar esse método para converter entre um Partition-Based Sync realm e um Flexible Sync realm ou vice-versa.
Agrupe um arquivo Realm em seu aplicativo de produção
Agora que você tem uma cópia do domínio com os dados "seed", é necessário empacotá-lo com seu aplicativo de produção. O processo de agrupamento depende se você está construindo um aplicativo móvel ou aplicativo Unity:
Navegue até o caminho que você especificou para o novo Realm e, em seguida, arraste o Arquivo de Realm recém-criado para o projeto compartilhado Maui/Xamarin no Visual Studio.
Quando solicitado, escolha Copy the file to the directory.
No projeto compartilhado, clique com o botão direito do mouse no Arquivo de Realm que você acabou de adicionar, escolha Build Action e, em seguida, escolha EmbeddedResource.
Abra seu projeto de produção Unity .
Na aba Projeto, Realm o novo arquivo de região para a pasta Ativos . Os ativos armazenados aqui estão disponíveis para o aplicativo por meio da propriedade
Application.dataPath
.
Observação
Compatibilidade entre plataformas
Os Arquivo de Realm não criptografados são compatíveis com várias plataformas, e é por isso que você pode agrupar o arquivo no projeto compartilhado.
Abrir um Realm a partir de um arquivo de Realm agrupado
Agora que você tem uma cópia do Realm incluída em seu aplicativo, é necessário adicionar o código para usá-lo. O código adicionado depende do tipo de aplicativo:
Antes de implantar seu aplicativo com o Realm agrupado, você precisa adicionar código para extrair o Realm dos recursos incorporados, salvá-lo no local de dados do aplicativo e, em seguida, abrir esse novo Realm no aplicativo. O código a seguir mostra como você pode fazer isso durante a inicialização do aplicativo. Observe que:
esse código só é executado quando nenhum Arquivo de Realm é encontrado no local especificado (normalmente, apenas no uso inicial do aplicativo) e
como você abre o Realm depende se você está trabalhando com um Realm sincronizado ou não. Para mais informações, consulte Abrir um Realm sem Sincronização.
// 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);
O realm incorporado é inicializado como qualquer outro realm em um projeto do Unity:
// 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);