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

帮助

  • 编程问题?询问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

时间: 2024-07-29 00:32:46

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

GitHub Top 100的Android开源库

本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库. 1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native,

Android开源库与设计模式开源组SAOS建立

Android开源库与设计模式开源组建立 简介 在2014年年底突然参与了CSDN的博客之星评选,看着自己的博客水平实在太低,于是就想一定得写一些跟别人不太一样的博客出来.经过自己的一番思考,觉得在Android开源库的深入实现上并没有什么太多的资料,或者只是大概讲述了一些基本原理.这样我觉得是不够的,很多事情你没有自己去经历你不会有很深的认识,或者你根本不知道原来它会出现这样的问题.于是我就想我没通过学习轮子制造过程来更加深入的学习,这样不仅能够了解那些知名的开源库,也能够从实战的角度学习开源

(android开源库android-gif-drawable)第二篇 加载网络gif图片

大家好,  今天给大家带来如何使用 android开源库android-gif-drawable来 加载网络gif图片 同样的DEMO下载地址在 最后 请大家去下载 . 如果gif图片地址无效 了.      请大家自行到网上去寻找一个 gif图片地址 复制过去就可以了.谢谢大家 不会在 eclipse下使用  (android开源库android-gif-drawable)     请看我的这篇博客   (android开源库android-gif-drawable)第一篇 eclipse使用

Android开源库

http://blog.csdn.net/xiaanming/article/details/9470223 一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才开始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台,而且他会自动的判断是调用原生Action Bar还是使用扩展ActionBar.在我的小熊词典里有用到这个库,而且很多非常知名的App也在使用这个库.GitHub Official Acti

Android 开源库获取途径整理

介绍目前收藏 Android 开源库比较多的 GitHub 项目.网站.Twitter.App 及如何获取最新的 Android 开源库. 1. GitHub Android 开源项目汇总 Android 优秀开源项目实现原理解析 把这两个放在前面,是因为这两个项目我和一群小伙伴在精心维护,同时任何人都可以提交 PR 参与进来.其他网站或 App 都可以以此为数据源 AndroidElementals 西班牙一工程师整理的,目前项目数量和介绍上与 Android 开源项目汇总 还有一定差距 2.

(android开源库android-gif-drawable)第一篇 eclipse使用这个开源库

android开源库android-gif-drawable的使用 android的开源库是用来在android上显示gif图片的.我在网上查了一下,大家说这个框架写的不错,加载大的gif图片   不会内存溢出,于是我就想试试这个开源库,我下了作者的源代码和例子,但是我却跑不起来.不知道为什么,我又到网上去找使用这个开源库的例子发现有一个,我也下载了下来,发现还是跑不起来.我决定自己好好试试这个源代码,终于在我的努力下现在可以用了.废话完了 现在教大家怎么用这个库.大家不想看怎么做的 可以到后面

【Java&amp;amp;Android开源库代码分析】のandroid-async-http の开盘

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来具体介绍这个库的实现,同一时候结合源代码探讨怎样设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,由于它对Apache的HttpClient API的封装使得开发人员能够简洁优雅的实现网络请求和响应,而且同一时候支持同步和异步请求. 网络请求框架一般至少须要具备例如

【Java&amp;Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同时支持同步和异步请求)开篇

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来详细介绍这个库的实现,同时结合源码探讨如何设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,因为它对Apache的HttpClient API的封装使得开发者可以简洁优雅的实现网络请求和响应,并且同时支持同步和异步请求. 网络请求框架一般至少需要具备如下几个组件:1

如何在android上 使用gif图片(android开源库android-gif-drawabl)

android开源库android-gif-drawable的使用 android的开源库是用来在android上显示gif图片的.我在网上查了一下,大家说这个框架写的不错,加载大的gif图片   不会内存溢出,于是我就想试试这个开源库,我下了作者的源代码和例子,但是我却跑不起来.不知道为什么,我又到网上去找使用这个开源库的例子发现有一个,我也下载了下来,发现还是跑不起来.我决定自己好好试试这个源代码,终于在我的努力下现在可以用了.废话完了 现在教大家怎么用这个库.大家不想看怎么做的 可以到后面