Configurar e abrir um Realm - SDK do Flutter
Nesta página
- Abrir um Realm
- Abra um Realm somente local
- Abrir um realm sincronizado
- Abrir um Realm na memória
- Configurar um Realm
- Abra um Realm somente leitura
- Definir arquivos especiais FIFO personalizados
- Adicionar dados iniciais ao Realm
- Personalizar configuração padrão
- Gerenciar alterações no esquema
- Criptografar um Realm
- Compactar um domínio
- Fechar um Realm
- Copiar dados para um novo domínio
Abrir um Realm
Use a configuração para controlar as especificidades do Realm que você gostaria de abrir, incluindo o esquema.
Abra um Realm somente local
Para criar um realm que persista os dados apenas localmente, crie uma configuração com Configuration.local(). Você deve fornecer uma lista de esquemas como um argumento.
Passe o Configuration
para o construtor Realm.
final config = Configuration.local([Car.schema]); final realm = Realm(config);
Agora você pode usar essa instância de domínio para trabalhar com objetos no banco de dados.
Abrir um realm sincronizado
Para abrir um domínio que sincroniza dados com Atlas utilizando a Device Sync, consulte Abrir um Realm Sincronizado.
Abrir um Realm na memória
Para criar um realm que executa na memória sem ser persistente, crie seu Configuration
com Configuration.inMemory(). Você deve fornecer uma lista de esquemas como um argumento. Os realms na memória também não podem ser somente para leitura.
Passe o Configuration
para o construtor do Realm .
final config = Configuration.inMemory([Car.schema]); final realm = Realm(config);
Configurar um Realm
Você pode adicionar propriedades opcionais ao Configuration
do domínio.
Abra um Realm somente leitura
Você pode abrir um domínio existente no modo somente leitura. Para abrir um domínio somente leitura, adicione readOnly: true
ao seu objeto Configuration
.
Você só pode abrir domínios existentes no modo somente leitura. Se você tentar gravar em um domínio somente leitura, ocorrerá um erro.
final config = Configuration.local([Car.schema], isReadOnly: true); final realm = Realm(config);
Definir arquivos especiais FIFO personalizados
Definir um valor para os arquivos especiais FIFO do Realm localização. A abertura de um Realm cria uma série de arquivos especiais FIFO leves que coordenam o acesso ao Realm entre threads e processos. Se o arquivo de Realm estiver em um local que não permite a criação de arquivos especiais FIFO (como sistemas de arquivos FAT32 ), o Realm não poderá ser aberto. Nesse caso, o Realm precisa de um local diferente para armazenar esses arquivos. Adicione fifoFilesFallbackPath: <Your Custom FIFO File Path>
ao seu objeto Configuration
.
Esta propriedade será ignorada se o diretório do arquivo de realm permitir arquivos especiais FIFO.
final config = Configuration.local([Car.schema], fifoFilesFallbackPath: "./fifo_folder"); final realm = Realm(config);
Adicionar dados iniciais ao Realm
Usar initialDataCallback() para invocar uma função de chamada de resposta de chamada na primeira vez que você abrir um Realm. A função é executada somente na primeira vez que você abre esse Realm no dispositivo. A instância do Realm passada para a função de chamada de resposta de chamada já tem uma transação de gravação aberta, portanto, não é necessário envolver as operações de gravação em um bloco de transação Realm.write()
. initialDataCallback
pode ser útil para adicionar dados iniciais ao seu aplicação na primeira vez que ele for aberto em um dispositivo.
void dataCb(Realm realm) { realm.add(Car(ObjectId(), 'Honda')); } final config = Configuration.local([Car.schema], initialDataCallback: dataCb); final realm = Realm(config); Car honda = realm.all<Car>()[0];
Personalizar configuração padrão
Você pode personalizar o caminho padrão em que o Realm armazena os arquivos do banco de dados e o nome padrão dado aos arquivos do banco de dados.
Use o estático Configuration.defaultRealmName e Configuration.defaultRealmPath para definir a configuração padrão para todos os domínios abertos dentro de um aplicativo.
Configuration.defaultRealmName = "myRealmName.realm"; final customDefaultRealmPath = path.join( (await Directory.systemTemp.createTemp()).path, Configuration.defaultRealmName); Configuration.defaultRealmPath = customDefaultRealmPath; // Configurations used in the application will use these values final config = Configuration.local([Car.schema]); // The path is your system's temp directory // with the file named 'myRealmName.realm' print(config.path);
Você também pode verificar onde o domínio armazena os arquivos por padrão usando o getter estático Configuration.defaultStoragePath. O valor dessa propriedade varia de acordo com a plataforma em que você está usando o SDK e se está usando as versões Dart ou Flutter do Realm. Verifique o valor do Configuration.defaultStoragePath
em seu aplicativo para ver onde os arquivos de área são armazenados em seu ambiente.
final storagePath = Configuration.defaultStoragePath; // See value in your application print(storagePath);
Gerenciar alterações no esquema
Para obter mais informações sobre como gerenciar alterações de esquema ao configurar um domínio, consulte a documentação Atualizar um esquema de objetos de Realm.
Criptografar um Realm
Você pode criptografar seu realm local para garantir a segurança dos dados. Para mais informações, consulte Criptografar um Realm.
Compactar um domínio
Você pode reduzir o tamanho do arquivo de região local para melhorar o desempenho e gerenciar o tamanho do arquivo em um ambiente com restrição de recursos. Para mais informações, consulte Compact a Realm.
Fechar um Realm
Quando terminar de trabalhar com um domínio, feche-o para evitar vazamentos de memória.
realm.close();
Quando terminar de trabalhar com um domínio, feche-o para evitar vazamentos de memória.
realm.close();
Se você estiver executando um aplicação Dart CLI , para evitar que o processo trave,chame Realm.shutdown().
Realm.shutdown();
Copiar dados para um novo domínio
Para copiar dados de um realm existente para um novo realm com diferentes opções de configuração, passe a nova configuração para Realm.writeCopy().
Na configuração do novo domínio, você deve especificar o path
. Você não pode gravar em um caminho que já contém um arquivo.
Com a utilização do Realm.writeCopy()
, você pode converter entre os seguintes tipos de Configuração:
LocalConfiguration
paraLocalConfiguration
FlexibleSyncConfiguration
paraFlexibleSyncConfiguration
InMemoryConfiguration
paraInMemoryConfiguration
LocalConfiguration
para somente leituraLocalConfiguration
e vice-versaInMemoryConfiguration
emLocalConfiguration
e vice-versaFlexibleSyncConfiguration
paraLocalConfiguration
FlexibleSyncConfiguration
paraInMemoryConfiguration
Você não pode converter de LocalConfiguration
ou InMemoryConfiguration
para FlexibleSyncConfiguration
.
Algumas considerações adicionais a serem lembradas ao usar Realm.writeCopy()
:
O arquivo de destino já não pode existir.
Não é permitido copiar um realm dentro de uma transação de escrita ou durante a migração.
Ao usar o Device Sync, você deve sincronizar todas as alterações locais com o servidor antes que a cópia seja gravada. Isso garante que o arquivo possa ser usado como ponto de partida para um aplicativo recém-instalado. O
Realm.writeCopy()
joga se houver carregamentos pendentes.
O exemplo seguinte copia os dados de um domínio com um InMemoryConfiguration
para um novo domínio com um LocalConfiguration
.
// Create in-memory realm and add data to it. // Note that even though the realm is in-memory, it still has a file path. // This is because in-memory realms still use memory-mapped files // for their operations; they just don't persist data across launches. final inMemoryRealm = Realm(Configuration.inMemory([Person.schema], path: 'inMemory.realm')); inMemoryRealm.write(() { inMemoryRealm.addAll([Person("Tanya"), Person("Greg"), Person("Portia")]); }); // Copy contents of `inMemoryRealm` to a new realm with `localConfig`. // `localConfig` uses the default file path for local realms. final localConfig = Configuration.local([Person.schema]); inMemoryRealm.writeCopy(localConfig); // Close the realm you just copied when you're done working with it. inMemoryRealm.close(); // Open the local realm that the data from `inMemoryRealm` // was just copied to with `localConfig`. final localRealm = Realm(localConfig); // Person object for "Tanya" is in `localRealm` because // the data was copied over with `inMemoryRealm.writeCopy()`. final tanya = localRealm.find<Person>("Tanya");
Você também pode incluir uma nova chave de criptografia na configuração do realm copiado ou remover a chave de criptografia da nova configuração.
O exemplo a seguir copia dados de um realm não criptografado com LocalConfiguration
para um realm criptografado com LocalConfiguration
.
// Create unencrypted realm and add data to it. final unencryptedRealm = Realm(Configuration.local([Person.schema])); unencryptedRealm.write(() => unencryptedRealm.addAll([ Person("Daphne"), Person("Harper"), Person("Ethan"), Person("Cameron") ])); // Create encryption key and encrypted realm. final key = List<int>.generate(64, (i) => Random().nextInt(256)); final encryptedConfig = Configuration.local([Person.schema], path: 'encrypted.realm', encryptionKey: key); // Copy the data from `unencryptedRealm` to a new realm with // the `encryptedConfig`. The data is encrypted as part of the copying. unencryptedRealm.writeCopy(encryptedConfig); // Close the realm you just copied when you're done working with it. unencryptedRealm.close(); // Open the new encrypted realm with `encryptedConfig`. final encryptedRealm = Realm(encryptedConfig); // Person object for "Harper" is in `localRealm` because // the data was copied over with `unencryptedRealm.writeCopy()`. final harper = encryptedRealm.find<Person>('Harper');