Realm (Java) de base de datos utilizando el documento (Reinos)


Realm (Java) de base de datos utilizando el documento (directorio)

Realm es un ejemplo de una base de datos del dispositivo móvil. Realm puede ser local o sincronizada. Realm Servidor uso sincronizado Realm objeto transparente sincronizar su contenido con otros dispositivos. Cuando su aplicación como un archivo local para continuar usando Reino sincrónica, el Reino de los datos se puede actualizar cualquier dispositivo con acceso de escritura al reino. De hecho, su aplicación puede trabajar con el mismo reino local o cualquier sincronización.

Si desea utilizar un dispositivo móvil para sincronizar toda la base de datos Realm Realm?
Todos los documentos relacionados con la sincronización se ha trasladado a nuestro documento plataforma

Para un análisis más detallado del reino, por favor leer el modelo de datos Realm .

2.1 inicialización

Creando una instancia de un nuevo Realmobjetos Realm abierta. Hemos visto en este ejemplo de uso:

// 初始化Realm
Realm.init(context);

// 获取此线程的Realm实例
Realm realm = Realm.getDefaultInstance();

getDefaultInstance()El método de usar el valor por defecto RealmConfigurationejemplo de configuración de Realm.

2.1.1 Configuración del Reino

Para crear un reino de forma controlada, utilizar el objeto RealmConfiguration. Realm más configuración básica como sigue:

RealmConfiguration config = new RealmConfiguration.Builder().build();

Esta configuración (sin opciones) Uso situado Context.getFilesDirreino de archivo default.realm. Para utilizar una configuración diferente, es necesario crear un nuevo RealmConfigurationobjetivo:

// 使用构建器模式创建RealmConfiguration。
// Realm文件将位于Context.getFilesDir()中,名称为“ myrealm.realm”
RealmConfiguration config = new RealmConfiguration.Builder()
  .name("myrealm.realm")
  .encryptionKey(getKey())
  .schemaVersion(42)
  .modules(new MySchemaModule())
  .migration(new MyMigration())
  .build();
// 使用配置
Realm realm = Realm.getInstance(config);

Se pueden tener varios objetos RealmConfiguration, para que pueda controlar de forma independiente la versión, la arquitectura y la ubicación de cada uno de los Realm.

RealmConfiguration myConfig = new RealmConfiguration.Builder()
  .name("myrealm.realm")
  .schemaVersion(2)
  .modules(new MyCustomSchema())
  .build();

RealmConfiguration otherConfig = new RealmConfiguration.Builder()
  .name("otherrealm.realm")
  .schemaVersion(5)
  .modules(new MyOtherSchema())
  .build();

Realm myRealm = Realm.getInstance(myConfig);
Realm otherRealm = Realm.getInstance(otherConfig);

Mediante el uso de Realm.getPathuna ruta absoluta para obtener campo.

Es importante tener en cuenta que el Realmejemplo es el producto único hilo, lo que significa que el constructor estático devolverá la misma instancia para responder a todas las llamadas de un hilo dado.

2.2.2 Realm predeterminado

Puede RealmConfigurationguardar la configuración por defecto. En la costumbre de aplicación de configuración de clase por defecto la configuración hace que sea disponible en toda la aplicación.

public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // 默认的Realm文件在Context.getFilesDir();中为“ default.realm”;
    // 我们将其更改为“ myrealm.realm”
    Realm.init(this);
    RealmConfiguration config = new RealmConfiguration.Builder().name("myrealm.realm").build();
    Realm.setDefaultConfiguration(config);
  }
}

public class MyActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Realm realm = Realm.getDefaultInstance(); // 打开“ myrealm.realm”
    try {
      // ... Do something ...
    } finally {
      realm.close();
    }
  }
}

2.2 La apertura de un Realm sincronizado

Si desea utilizar un dispositivo móvil para sincronizar toda la base de datos Realm Realm?
Todos los documentos relacionados con la sincronización se ha trasladado a nuestro documento plataforma

2.3 de sólo lectura Reinos

Sólo lecturaSólo forzada en el proceso actual. Otros procesos o dispositivos todavía es posible escribirSólo lecturaReinos. Además, para cualquier transacción de escritura va a lanzar una Reinos de sólo lecturaIllegalStateException. Esto incluye el intento de modo de escribir, por lo que inicialmente debe ser proporcionada por otras fuentes.

Viene reino de archivo de lista en su aplicación y, a veces útil - es posible que desee compartir algunos de sus datos y aplicaciones agrupados. En muchos casos, usted no desea modificar accidentalmente el reino, simplemente porque los datos es de sólo lectura. Puede sujetar reino de archivo de los activos y el uso de la configuración de sólo lectura para hacer esto:

RealmConfiguration config = new RealmConfiguration.Builder()
    .assetFile("my.realm")
    .readOnly()
    // 可选的,但是建议创建一个模块来描述捆绑文件中的类。 否则,如果您的App包含文件中找不到的其他类,则由于无法以只读模式更新架构,因此在打开Realm时它将崩溃。
    .modules(new BundledRealmModule())
    .build();

2.4 Reinos de memoria

Uso inMemoryde configuración, se puede crear un reino bastante persistente a las corridas de disco completo en la memoria.

RealmConfiguration myConfig = new RealmConfiguration.Builder()
    .name("myrealm.realm")
    .inMemory()
    .build();

Si no hay suficiente memoria, la memoria del Reino aún puede utilizar el espacio de disco, pero todos los archivos creados por el recuerdo del reino será eliminada cuando se cierra el reino. Permitido crear la memoria permanente utilizando el mismo nombre nombres Realm Realm- todavía debe ser único.

Cuando todas las instancias Realm memoria de un nombre particular sin apartarse de los datos de alcance y de referencia se libere toda la Realm. Para mantener la memoria de la "activa" en el curso de la ejecución de toda la aplicación, por favor, tenga una referencia a él.

2.5 Realms dinámico - DynamicRealm

En convencional Realmcuando se utiliza RealmObjectla clase subclase modelo de definición. Sobre el tipo de seguridad, que tiene muchas ventajas. Pero a veces, este tipo sólo están disponibles cuando se ejecuta, por ejemplo, durante la migración o la cadena de datos basada en archivos CSV, puede utilizar DynamicRealm!

DynamicRealm es una variante del Reino convencional, se pueden utilizar los datos sin usar el Realm RealmObjectsubclase. Pero cadena uso directo en lugar de clase para completar todos los accesos.

Abrir el mismo DynamicRealm configuración mediante Realm convencional, pero DynamicRealm ignorará cualquier versión de arquitectura, la migración y el esquema configurado.

RealmConfiguration realmConfig = new RealmConfiguration.Builder().build();
DynamicRealm realm = DynamicRealm.getInstance(realmConfig);

// 在DynamicRealm中,所有对象都是DynamicRealmObjects
realm.beginTransaction();
DynamicRealmObject person = realm.createObject("Person");
realm.commitTransaction();

// 使用字符串访问所有字段
String name = person.getString("name");
int age = person.getInt("age");

// 基础架构仍然存在,因此访问不存在的字段将引发异常
person.getString("I don't exist");

// 查询仍然可以正常工作
RealmResults<DynamicRealmObject> persons = realm.where("Person")
    .equalTo("name", "John")
    .findAll();

DynamicRealmA expensas de la flexibilidad y la ganancia de rendimiento flexibilidad. En general, se debe utilizar el Reino convencional. DynamicRealm utiliza sólo cuando se necesita esta flexibilidad.

2.6 Cerrar Reinos

RealmImplementado Closeablea proceso y la memoria descriptor de archivo nativo redistribuir, y por lo tanto el uso de Realm Después ejemplo, asegúrese de cerrarlas.

RealmEjemplos de ello son la referencia contado - si se llama dos veces en el hilo getInstance, también necesita dos llamadas close. Esto le permite implementar Runnablela clase sin tener que preocuparse por cuál de ellos va a ejecutarlas: sólo para getInstanceel comienzo y al closefinal de la lata.

Para el hilo de interfaz de usuario, la manera más fácil es tener un componente onDestroy()método de ejecución realm.close. Si es necesario crear fuera de la interfaz de usuario de Looperhilo, se pueden utilizar los siguientes modos:

public class MyThread extends Thread {

    private Realm realm;

    @Override
    public void run() {
        Looper.prepare();
        realm = Realm.getDefaultInstance();
        try {
            //... 使用Realm实例设置处理程序 ...
            Looper.loop();
        } finally {
            realm.close();
        }
    }
}

Para AsyncTask, este es un buen modelo:

protected Void doInBackground(Void... params) {
    Realm realm = Realm.getDefaultInstance();
    try {
        // ... Use the Realm instance ...
    } finally {
        realm.close();
    }

    return null;
}

Si utiliza Threado Runnablepara tareas a corto plazo:

// Run a non-Looper thread with a Realm instance.
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        Realm realm = Realm.getDefaultInstance();
        try {
            // ... Use the Realm instance ...
        } finally {
            realm.close();
        }
    }
});

thread.start();

Si está utilizando minSdkVersion> = 19y Java> = 7la aplicación, puede utilizar el try-con-recursos:

try (Realm realm = Realm.getDefaultInstance()) {
    // 无需手动关闭Realm实例
}

2.7 actualización automática

Si a partir de los Looper casos Realm conseguir asociados con el hilo, la instancia Realm tendrá la función de actualización automática. (Rosca Android interfaz de usuario es Looper.) Esto significa que los casos Realm se actualizan periódicamente a la última versión. Esto le permite sin esfuerzo con el contenido más reciente actualización constante de la interfaz de usuario!

Si nunca has conectar Looperel hilo se pone instancia Reino, en la llamada waitForChangeantes de que el método, el objeto en este ejemplo no se actualiza. Mantener la versión anterior de los datos es muy caro en términos de memoria y espacio en disco, y aumenta a medida que el número de versiones retenido entre la versión y la versión más reciente, el costo se incrementará. Es por esto que es muy importante razón para el cierre completo inmediatamente después de que el hilo ejemplo Realm.

Para comprobar si la instancia Reino activa automáticamente actualización, utilice el isAutoRefreshmétodo.

Publicado 59 artículos originales · ganado elogios 88 · vistas 190 000 +

Supongo que te gusta

Origin blog.csdn.net/geofferysun/article/details/105040333
Recomendado
Clasificación