Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Realm Java 官方教程翻译 (三):Relationships

Realm Java 官方教程翻译 (三):Relationships

作者头像
青蛙要fly
发布于 2024-01-29 00:33:51
发布于 2024-01-29 00:33:51
19600
代码可运行
举报
运行总次数:0
代码可运行

今天我们翻译下图显示的目录中的Relationships模块

这篇翻译所要翻译的内容如下图所示:

Relationships

任意二个RealmObjects 能够被连接到一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Email extends RealmObject {
    private String address;
    private boolean active;
    // ... setters 和 getters方法
}

public class Contact extends RealmObject {
    private String name;
    private Email email;
    // ... setters 和 getters 方法
}

这一段大概意思懂,但不知道该怎么直译比较好,一些专业的在数据库中的术语不好直接翻译。请大家帮忙看下。下面评论里回复下。谢谢了 (我是这么翻译的:在Realm中,Relationships 在Realm中是低消耗的。这意味着,建立一个链接在速度方面并不是高消耗,并且relationships的内部展现在内存消耗方面又是高效的。)

Relationships are generally cheap in Realm. This means that following a link is not expensive in terms of speed, and the internal presentation of relationships is highly efficient in terms of memory consumption.


Many-to-One

在你的类型为RealmObject子类中定义一个属性,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Contact extends RealmObject {
    private Email email;
    // Other fields…
}

每个contact (Contact实例) 有 0个或者1个 email (Email实例)。在Realm中,无法阻止你在不同的contact对象中使用相同的email对象。并且上述的model可以是many-to-one(多对一)的关系。但是经常被用做成为one-to-one(一对一)的关系。

设置RealmObjectnull,将会清除引用但是object不会从Realm中删除。

Many-to-Many

通过object中的 RealmList字段声明来建立与任何数量的objects之间的关系。举例来说,一个contact会有多个email地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Contact extends RealmObject {
    public String name;
    public RealmList emails;
}

public class Email extends RealmObject {
    public String address;
    public boolean active;
}

RealmLists 主要包含RealmObjects,并且RealmList表现的很像JavaList。在Realm中,对于一个相同的object 在不同的RealmLists中被使用了二次(或者更多)并不进行限制。因此你能对model使用one-to-many(一对多)和many-to-many(多对多)关系。

你能创建objects ,并且使用RealmList.add()来给Contact 对象添加Email 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Contact contact = realm.createObject(Contact.class);
        contact.name = "John Doe";

        Email email1 = realm.createObject(Email.class);
        email1.address = "john@example.com";
        email1.active = true;
        contact.emails.add(email1);

        Email email2 = realm.createObject(Email.class);
        email2.address = "jd@example.com";
        email2.active = false;
        contact.emails.add(email2);
    }
});

当在给确定的数据类型建立模型的时候,进行声明递归关系会显得有用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person extends RealmObject {
    public String name;
    public RealmList friends;
    // Other fields…
}

RealmList字段的值设置为null后会清空list。就是说list将会变空(长度为0),但是没有objects被删除,RealmList的getter方法获取永远不会为null。返回的objects总是为list,但是长度可能是0。

Link queries

有可能需要查询链接或关系,细想下面的这个model:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person extends RealmObject {
  private String id;
  private String name;
  private RealmList dogs;
  // getters and setters
}

public class Dog extends RealmObject {
  private String id;
  private String name;
  private String color;
  // getters and setters
}

如这个图所示:每个Person对象会有多个dog的关系。

让我们来通过链接查询找到一些person。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// persons => [U1,U2]
RealmResults persons = realm.where(Person.class)
                                .equalTo("dogs.color", "Brown")
                                .findAll();

首先,注意到equalTo里面的字段包含了关系对应的方式(通过.分割)。

上面的查询可以这么理解:查询出所有的人,而且这些人都有着颜色为“Brown”的狗。重要的是要懂的:这些搜出来的Person object中也会包含那些不满足条件的Dog objects。因为这些不满足的Dog objects 也是Person’s object的一部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
persons.get(0).getDogs(); // => [A,B]
persons.get(1).getDogs(); // => [B,C,D]

这可以通过以下两个查询进一步检查。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// r1 => [U1,U2]
RealmResults r1 = realm.where(Person.class)
                             .equalTo("dogs.name", "Fluffy")
                             .findAll();

// r2 => [U1,U2]
RealmResults r2 = r1.where()
                          .equalTo("dogs.color", "Brown")
                          .findAll();

注意到第一个查询返回了二个Person objects ,因为这二个persons 符合条件,查询到的结果中每个Person都包含着一系列的Dog objects(是他们所拥有的所有的狗,即使有些狗不满足查询时候的条件)。记住,我们搜索的是拥有特定种类的狗(狗的名字和狗的颜色)的那些人。而不是去搜这些特定的狗。因此,第二个查询也将与第一个查询的Person(r1)及这些Person的dogs也一样。这些人也都符合第二次查询的条件,只是这次是通过狗的颜色来查询的。

让我们再深入一点了解情况,帮助巩固这个概念。请看下面的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// r1 => [U1,U2]
RealmResults r1 = realm.where(Person.class)
                             .equalTo("dogs.name", "Fluffy")
                             .equalTo("dogs.color", "Brown")
                             .findAll();

// r2 => [U2]
RealmResults r2 = realm.where(Person.class)
                             .equalTo("dogs.name", "Fluffy")
                             .findAll()
                             .where()
                             .equalTo("dogs.color", "Brown")
                             .findAll();
                             .where()
                             .equalTo("dogs.color", "Yellow")
                             .findAll();

第一个查询可以这么理解:分别查找拥有名叫Fluffy小狗的所有Persons及查找拥有小狗颜色为Brown的所有Persons。然后对二者所查到的Persons取交集。 第二个查询可以这么理解:查找拥有名字叫Fluffy小狗的所有Persons。然后在该结果集中继续查找拥有颜色为“Brown”小狗的所有Persons,然后再在该结果集中继续查找拥有颜色为“Yellow”的所有Persons。

让我们详细了解下 r1这个结果的背后到底发生了什么。二个条件分别是equalTo("dogs.name", "Fluffy")equalTo("dogs.color", "Brown")。满足第一个条件的是U1和U2(记这个结果集为C1)。满足第二个条件的是U1和U2(记这个结果集为C2)。在查询中的‘与’逻辑操作相当于对C1和C2的交集。而C1和C2的交集就是U1和U2,所以r1就是U1和U2.

第二个查询的结果r2是不同的。首先第一部分的查询就像是这样:ealmResults r2a = realm.where(Person.class).equalTo("dogs.name", "Fluffy").findAll(); 符合的条件:U1和U2。然后r2b = r2a.where().equalTo("dogs.color", "Brown").findAll();同样符合的是U1和U2(所有的人都有brown dogs),最后的查询是r2 = r2b.where().equalTo("dogs.color", "Yellow").findAll();。符合的只有U2,由于在brown dog 的结果集中只有一个person有 Yesllow dog,即U2。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Realm Java 官方教程翻译 (一):Getting Started
因为准备暂时的抛弃Sqlite而转成Realm。所以在Realm官网上看相关的教程。看见官网有相应的Java-Realm方面的使用教程,于是准备写Realm相关的知识。但是是全英文的,所以按照官网的教程的步骤,准备分篇来进行翻译。当然希望大家如果发现哪里有问题,可以提出来,(不要打我脸)。
青蛙要fly
2024/02/18
3320
Realm Java 官方教程翻译 (一):Getting Started
【Android】Realm详解
介绍 Realm 是一个 MVCC (多版本并发控制)数据库,由Y Combinator公司在2014年7月发布一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库,目标是取代SQLite。 Realm 本质上是一个嵌入式数据库,他并不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。和SQLite不同,它允许你在持久层直接和数据对象工作。在它之上是一个函数式风格的查询api,众多的努力让它比传统的SQLite 操作更快 。 详细介绍(如果进不去,看这个也行)
Gavin-ZYX
2018/05/18
4.5K0
Realm Java 官方教程翻译 (二):Getting Help 及 Models
对于你的代码是否需要帮忙?在StackOverflow : realm上进行询问,我们会积极的查看问题及进行回答!
青蛙要fly
2024/01/27
1790
Realm Java 官方教程翻译 (二):Getting Help 及 Models
Android十八章:Realm-in-android
Realm是一个开源的ORM概念的(对象关系映射)移动数据库,可以在Android ,ios ,java各个平台上使用,性能秒杀sqlite等数据库比如(greendao)。
ppjun
2018/09/05
1.1K0
Realm技术选型初体验
Realm Realm 是一个 MVCC (多版本并发控制)数据库,由Y Combinator公司在2014年7月发布一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库,目标是取代SQLite。 Realm 本质上是一个嵌入式数据库,他并不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。和SQLite不同,它允许你在持久层直接和数据对象工作。在它之上是一个函数式风格的查询api,众多的努力让它比传统的SQLite 操作更快 查看官网介绍:https://r
巫山老妖
2018/07/20
7650
Realm数据库学习之快速入门
任何数据库都无非是CRUD的操作,也就是为了增、删、改、查的使命。 相对于传统的原生的Sqlite开发,Realm的API使开发者显得轻松自在。
Frank909
2019/01/14
6790
Android Realm初试
Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository holds the source code for the Java version of Realm, which currently runs only on Android.
方志朋
2022/11/30
5270
Android数据库Realm实践
Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。 2. SugarORM SugarORM 是 Android 平台专用ORM。提供简单易学的APIs。可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化CRUD基本操
xiangzhihong
2018/02/02
1.5K0
Android数据库Realm实践
Realm 基本用法
前提 Android Studio 1.5.1 或者更高版本; JDK 版本 >=7; 较新的 Android SDK 版本; 支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。 为什么使用Realm Realm Java 让你能够高效地编写 app 的模型层代码,保证你的数据被安全、快速地存储。 1、Realm基本配置 A.在module的build.gradle中添加如下代码: apply plugin: 'realm-android' 如
code_horse
2018/07/02
1.3K0
Android开发笔记(八十五)手机数据库Realm
Android自带的SQLite数据库,在多数场合能够满足我们的需求,但随着app广泛使用,SQLite也暴露了几个不足之处: 1、开发者编码比较麻烦,而且还要求开发者具备SQL语法知识; 2、SQLite默认没有加密功能,手机一旦丢失容易导致数据库被破解; 3、SQLite底层采用java代码,导致性能提升存在瓶颈; 基于以上几点,Android上的各种ORM应运而生(ORM全称Object Relational Mapping,即对象关系映射),最常见的便是greenDAO了。greenDAO是一个将对象映射到SQLite数据库中的ORM解决方案,它在github上的地址是https://github.com/greenrobot/greenDAO,下面是greenDAO相比直接使用SQLite的几个改进点: 1、简化数据库操作的编码,开发者可以不用熟悉SQL语法; 2、使用灵活,可在实体类中自定义类和枚举类型; 3、号称是基于SQLite的ORM框架中性能最好的;(博主没对比greenDAO与直接使用SQLite的性能差异,所以只能是跟其他ORM框架比较,比如ORMLite、sugarORM等等) 但是greenDAO使用的数据库引擎还是SQLite,因此某些方面并没有本质的改善,比如数据库的加密、数据库操作的性能等等。 对于Realm来说,这些改善就是可能的了,因为Realm有自己的数据库引擎,而且引擎使用C++编写,性能比java引擎的SQLite有数倍提升。Realm使用C++引擎还有一个好处,就是可以跨平台使用,不但能用于Android,也能用于IOS。Realm的第三个好处是,它具有很多移动设备专用数据库的特性,比如支持JSON、流式api、数据变更通知,以及加密支持,这些都为开发者带来了方便。
aqi00
2019/01/18
1.9K0
手把手教你从 Core Data 迁移到 Realm - 简书
看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库。号称是用来替代SQLite 和 Core Data的。Realm有以下优点:
一缕殇流化隐半边冰霜
2024/02/14
2980
手把手教你从 Core Data 迁移到 Realm - 简书
React Native 使用Realm数据库组件
使用Realm Studio来调试查看编辑数据库里的数据,支持Mac、Windows、Linux。
forrest23
2018/08/03
1.5K0
React Native 使用Realm数据库组件
Java泛型详解
Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx())
timerring
2023/05/07
5010
Java泛型详解
Realm数据库 从入门到“放弃”
Realm是由Y Combinator公司孵化出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Realm 2.0.2,支持的平台包括Java,Objective-C,Swift,React Native,Xamarin。
一缕殇流化隐半边冰霜
2018/08/30
5.2K0
[ SSH框架 ] Hibernate框架学习之三
一、表关系的分析   Hibernate框架实现了ORM的思想,将关系数据库中表的数据映射成对象,使开发人员把对数据库的操作转化为对对象的操作,Hibernate的关联关系映射主要包括多表的映射配置、
Kevin_Zhang
2018/05/22
1.8K0
Java 中文官方教程 2022 版(三)
一个典型的 Java 程序会创建许多对象,正如您所知,这些对象通过调用方法进行交互。通过这些对象之间的交互,程序可以执行各种任务,比如实现 GUI、运行动画,或者在网络上传输和接收信息。一旦一个对象完成了它被创建的工作,它的资源就会被回收以供其他对象使用。
ApacheCN_飞龙
2024/05/24
4400
Java 中文官方教程 2022 版(三)
Java基础(九):Object 类的使用
使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++等非Java语言实现的,并且被编译成了DLL,由Java去调用
冬天vs不冷
2025/01/21
1560
Java基础(九):Object 类的使用
Java基础教程(全代码解析)
掌握一门面向对象语言的语法 掌握面向对象的思维方式 熟悉面向对象设计原则 掌握面向对象设计模式
达达前端
2022/04/29
8380
Java基础教程(全代码解析)
还在手动维护API文档吗?是时候用用丝袜哥(swagger)了!
OpenAPI规范是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程。OpenAPI规范帮助我们描述一个API的基本信息。
行百里er
2020/12/02
1.2K0
还在手动维护API文档吗?是时候用用丝袜哥(swagger)了!
java深拷贝的实现方式_接口可以创建对象吗
Cloneable接口与Serializable接口都是定义接口而没有任何的方法。Cloneable可以实现对象的克隆复制,Serializable主要是对象序列化的接口定义。很多时候我们涉及到对象的复制,我们不可能都去使用setter去实现,这样编写代码的效率太低。JDK提供的Cloneable接口正是为了解决对象复制的问题而存在。Cloneable结合Serializable接口可以实现JVM对象的深度复制。
全栈程序员站长
2022/11/04
1.6K0
相关推荐
Realm Java 官方教程翻译 (一):Getting Started
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验