按 ID 引用 Realm.io 个 FK 对象

Referring to Realm.io FK objects by ID

我正在尝试在 Android 中创建一个 Realm 数据库,它反映了我在 SQL 服务器中拥有的数据库。这个想法是定期更新 Android 上的那个,以便两者具有相同的数据。

为简单起见,假设我有三个 table:对象、颜色、形状。我的主要 table 对象具有这种形式:

ID      |  int
------------------
Name    |  string
------------------
IDColor |  int
------------------
IDShape |  int

其中 IDColor 和 IDShape 指的是颜色和形状 table。这两个内容不重要

我想做的是在Android上定义这样的东西:

public class MyObject extends RealmObject {
    @Required
    private String name;
    private Color color;
    private Shape shape;
}

这样我就可以直接引用MyObject.color和MyObject.shape了。但是,据我所知,这样我无法通过 ID 指定颜色和形状,因此 realm.copyToRealmOrUpdate 将不起作用。

是否有替代方案允许我直接(理想)或在一些预处理或 post 处理后导入我的 JSON?

谢谢

编辑:我找到了一种使用 Xamarin 执行类似操作的方法。 请参阅下面的答案。

Realm 是一个对象数据库,因此在这种情况下,独立导入 3 个表实际上行不通。您需要进行一些预处理来设置对象结构。

您可以通过将输入数据转换为 JSONObject 并使用 realm.createOrUpdateFromJsonObject() 方法来实现。它的行为类似于 copyToRealmOrUpdate 除了它直接作用于 JSON.

伪代码:

JSONObject obj = new JSONObject(myObjectJson);
obj.put("color", getColorJson(obj.getInt("IDColor")));
realm.creteOrUpdateFromJSonObject(obj);

我不再使用 "vanilla Android",但我发现在 Xamarin 中可以按照我原来的问题做我想做的事情,如下所示:

public class MyObject: RealmObject
{
    public int IdColor {get; set;}
    public Color color
    {
        get
        {
            return realm.All<Color>().FirstOrDefault(x => x.Id == IdColor);
        }
        set
        {
            IdColor = value.Id;
        }
    }
}

Realm 会忽略任何自定义的 getter 和 setter,因此对象不会持久保存在数据库中。这是我发现在 Realm 中复制传统 SQL 数据库的 FK 行为的最简单方法。