Menu Docs

Arquivos Realm do pacote - .NET SDK

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 .

  1. 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.

  2. 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.

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:

  1. 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.

  2. Quando solicitado, escolha Copy the file to the directory.

  3. 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.

  1. Abra seu projeto de produção Unity .

  2. 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.

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);