码迷,mamicode.com
首页 > 移动开发 > 详细

<Android开源库> Realm For Android~ Getting Help and Models(译文)

时间:2017-03-05 21:17:36      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:接口   roi   hang   ref   epo   情况   方法   检查   UI   

帮助

  • 编程问题?询问StackOverflow, 我们会积极地监督和回答问题!
  • 提交Bug? 在我们的repo打开一个问题。 如果可以的话,请告知我们Realm版本,完整日志,Realm文件和显示问题的项目。
  • 功能请求? 在我们的repo打开一个问题。 告诉我们该功能应该做什么,以及为什么需要该功能。
  • 想了解接下来我们会更新什么内容? 看看我们的changelog。 日志显示我们计划最近发布的最新添加和更改,以及Realm的发展历史。

模型

Realm model类都是RealmObject的子类

public class User extends RealmObject {

    private String          name;
    private int             age;

    @Ignore
    private int             sessionId;

    // Standard getters & setters generated by your IDE…
    public String getName() { return name; }
    public void   setName(String name) { this.name = name; }
    public int    getAge() { return age; }
    public void   setAge(int age) { this.age = age; }
    public int    getSessionId() { return sessionId; }
    public void   setSessionId(int sessionId) { this.sessionId = sessionId; }
}

一个Realm Model类同样支持public,protected,private字段和自定义方法

public class User extends RealmObject {

    public String name;

    public boolean hasLongName() {
      return name.length() > 7;
    }

    @Override
    public boolean equals(Object o) {
      // Custom equals comparison
    }
}

字段类型

Realm支持以下字段类型:boolean,byte,short,int,long,float,double,String,Date和byte []。 整数类型byte,short,int和long都在Realm中映射到相同的类型(实际上是long)。 此外,RealmObject和RealmList

必填字段和空值

在某些情况下,null不是字段的适当值。 @Required注解可以用于告诉Realm强制执行检查以禁止空值。 只有布尔值,字节,短整型,整数,长整数,浮点型,双精度型,字符串型,字节型[]和日期可以注解为必填。 其他类型的字段具有@Required注解时,编译将失败。 原始类型和RealmList类型的字段默认就是必填的。 RealmObject类型的字段始终可空的。


忽略属性

注解@Ignore意味着一个字段不应该持久化到磁盘。 如果你的输入包含的字段多于模型的字段,并且你不希望有很多特殊情况来处理这些未使用的数据字段,则忽略字段很有用。


自动更新对象

RealmObjects是实时的,自动更新视图到底层数据,这意味着对象不必被刷新。 修改影响查询的对象将立即反映在结果中。

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Dog myDog = realm.createObject(Dog.class);
        myDog.setName("Fido");
        myDog.setAge(1);
    }
});
Dog myDog = realm.where(Dog.class).equalTo("age", 1).findFirst();

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Dog myPuppy = realm.where(Dog.class).equalTo("age", 1).findFirst();
        myPuppy.setAge(2);
    }
});

myDog.getAge(); // => 2

所有RealmObject和RealmResults的这个属性不仅保持了Realm的快速和高效,而且它允许你的代码更简单,更灵活。 例如,如果你的Activity或Fragment依赖于特定的RealmObject或RealmResults实例,则在更新UI之前不必担心刷新或重新获取它。
你可以订阅Realm通知,以了解Realm数据何时更新,指示应用的UI应该何时刷新


索引属性

注解@Index将向字段添加搜索索引。 这将使插入速度更慢,数据文件更大,但查询速度更快。 因此,建议只在优化读取性能的特定情况时添加索引。 我们支持索引:String,byte,short,int,long,boolean和Date字段。


主键

要将字段提升为主键,请使用注解@PrimaryKey,字段类型必须要么是string(String),要么就是整数(byte,short,int或long)及其封装类(Byte,Short,Integer和Long)。不能使用多个字段(复合键)作为主键。使用字符串字段作为主键意味着字段被索引(注释@PrimaryKey隐式地设置注解@Index)。

使用主键后,我们可以使用copyToRealmOrUpdate()方法使用此主键查找现有对象,如果找到,则更新它;如果没有找到,它将创建一个新的对象。在没有主键的类上调用copyToRealmOrUpdate()时,将抛出异常。

使用主键对性能有影响。创建和更新对象会有点慢,而查询预计会有点快。由于性能的变化取决于数据集的大小,因此很难给出明确的数值。

当调用Realm.createObject()时,它将返回一个新对象,所有字段都设置为默认值。在这种情况下,可能与主键字段为默认值的现有对象存在冲突。为了避免这种情况,建议创建一个非托管对象,设置字段的值,然后通过copyToRealm()方法将其复制到Realm。

final MyObject obj = new MyObject();
obj.setId(42);
obj.setName("Fish");
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        // This will create a new object in Realm or throw an exception if the
        // object already exists (same primary key)
        // realm.copyToRealm(obj);

        // This will update an existing object with the same primary key
        // or create a new object if an object with no primary key = 42
        realm.copyToRealmOrUpdate(obj);
    }
});

对于string(String)和封装 整型(Byte,Short,Integer和Long),主键可以具有null值,除非@PrimaryKey与@Required配合使用。


自定义对象

我们几乎可以RealmObjects当作POJO来使用。 继承自RealmObject,我们可以设置public 字段,并使用简单的赋值,而不是setter和getter。 这样的模型类的一个例子是

public class Dog extends RealmObject {
    public String name;
    public int age;
}

你可以像任何其他类一样使用Dog。 为了在Realm中创建受管理的Dog对象,可以使用createObject()或copyToRealm()方法。

realm.executeTransaction(new Realm.Transaction() {
    @Overrride
    public void execute(Realm realm) {
        Dog dog = realm.createObject(Dog.class);
        dog.name = "Fido";
        dog.age  = 5;
    }
};

你可以添加逻辑到你的setters和getters如果更好地满足你的需要。 如果你希望在将值存储在Realm之前验证值,这可能很有用。 此外,你可以轻松地添加自定义方法到RealmObjects。


限制

目前不支持final,transient 和volatile 字段。 这主要是为了避免对象如何由Realm管理或不受管理的行为之间的差异。

Realm Model类不允许继承除RealmObject之外的任何其他对象。 如果要声明构造函数,默认构造函数(没有参数的构造函数)必须始终为空。 原因是默认的构造函数会调用假定存在Realm实例的方法。 但是这个实例不是在创建者返回之前创建的。 你也可以自己添加构造函数。


Realm Model 接口

另一种继承RealmObject的方法是实现RealmModel接口并添加@RealmClass注解

@RealmClass
public class User implements RealmModel {

}

RealmObject上可用的所有方法都可以通过静态方法使用。

// With RealmObject
user.isValid();
user.addChangeListener(listener);

// With RealmModel
RealmObject.isValid(user);
RealmObject.addChangeListener(user, listener);
Relationships

原文链接

https://realm.io/docs/java/latest/#getting-help

<Android开源库> Realm For Android~ Getting Help and Models(译文)

标签:接口   roi   hang   ref   epo   情况   方法   检查   UI   

原文地址:http://blog.csdn.net/poorkick/article/details/60141953

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!