gpt4 book ai didi

android - 无法从 Realm 对象检索字段值,调试器中的值为空

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:52 27 4
gpt4 key购买 nike

我的 RealmObject 值似乎被 RealmProxy 类隐藏了,但可以从代理类中设置。

如您所见,我的模型非常简单。

public class GroupRealm extends RealmObject {
@PrimaryKey
public String id;
@Index
public String name;
public String imageUrl;
public int order;

public GroupRealm parent;
public RealmList<GroupRealm> children;
public RealmList<ContentRealm> contents;
}

这就是我设置值的方式(db 是一个有效的 Realm ,并且一切都在一个提交良好的事务中):

GroupRealm gr = db.where(GroupRealm.class).equalTo("id",g.GroupID).findFirst();
if(gr==null){
gr = db.createObject(GroupRealm.class,g.GroupID);
}
gr.imageUrl = g.GlyphUrl;
gr.name = g.Title;
gr.order = g.OrderNum;

下图是我在后面查询数据库时得到的结果。(相同的变量名在代码中的不同位置)

RealmObject has values RealmProxyClass does not

在我的 android.library 中,我的 RealmObjects 被定义为项目,我有必要的插件。

apply plugin: 'com.android.library'
apply plugin: 'realm-android'

并且在项目级别我设置了正确的依赖项:

dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath "io.realm:realm-gradle-plugin:0.90.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}

我没有想法。如果我尝试访问任何内容,我会按预期检索 GroupRealm,但通过代理类公开的所有公共(public)属性都会返回 null!

最佳答案

文档中的相关常见问题解答:https://realm.io/docs/java/latest/#debugging


Realm 使用 Android Gradle Transform API。它提供了在将编译的类文件转换为 dex 文件之前对其进行操作的可能性。
io.realm.transformer.RealmTransformerio.realm.transformer 中的更多详细信息。可以在 Realm 的 github 中找到的 BytecodeModifier 类。

RealmTransformer 的作用包括:

  • 用适当的 Realm 访问器替换对用户 RealmObjects 字段的所有访问。

您还可以检查文件夹 app/build/intermediates/transforms/RealmTransformer/ 中的结果类

setter 示例:
您的代码行:

gr.imageUrl = g.GlyphUrl;

将被这样的东西取代:

String var5 = g.GlyphUrl;
gr.realmSet$imageUrl(var5);

setter/getter 示例:

String url = gr.imageUrl;

将被这样的东西取代:

String url = gr.realmGet$imageUrl();

示例用例

  1. 您已经创建了类 GroupRealm。使用 Transform API 的 Realm 生成 GroupRealmRealmProxy。这个代理类看起来像这样:

    public class GroupRealmRealmProxy extends GroupRealm implements RealmObjectProxy, GroupRealmRealmProxyInterface {
    private final GroupRealmRealmProxy.GroupRealmColumnInfo columnInfo;
    private final ProxyState proxyState;
    private RealmList<GroupRealm> childrenRealmList;
    private RealmList<ContentRealm> contentsRealmList;
    private static final List<String> FIELD_NAMES;

    GroupRealmRealmProxy(ColumnInfo columnInfo) {
    ...
    }

    public String realmGet$id() {
    this.proxyState.getRealm$realm().checkIfValid();
    return this.proxyState.getRow$realm().getString(this.columnInfo.idIndex);
    }

    public void realmSet$id(String value) {
    this.proxyState.getRealm$realm().checkIfValid();
    if(value == null) {
    this.proxyState.getRow$realm().setNull(this.columnInfo.idIndex);
    } else {
    this.proxyState.getRow$realm().setString(this.columnInfo.idIndex, value);
    }
    }

    public String realmGet$name() {
    this.proxyState.getRealm$realm().checkIfValid();
    return this.proxyState.getRow$realm().getString(this.columnInfo.nameIndex);
    }

    public void realmSet$name(String value) {
    this.proxyState.getRealm$realm().checkIfValid();
    if(value == null) {
    this.proxyState.getRow$realm().setNull(this.columnInfo.nameIndex);
    } else {
    this.proxyState.getRow$realm().setString(this.columnInfo.nameIndex, value);
    }
    }

    ...
    }

    您可以观察到 realmSet$namerealmGet$name 方法无法访问类 GroupRealm 中声明的字段 name。他们使用 proxyState

  2. 现在,让我们回到 GroupRealm 的用法。调试代码时:

    GroupRealm gr = db.where(GroupRealm.class).equalTo("id",g.GroupID).findFirst();
    if(gr==null){
    gr = db.createObject(GroupRealm.class,g.GroupID);
    }
    gr.imageUrl = g.GlyphUrl;
    gr.name = g.Title;
    gr.order = g.OrderNum;

    实际上它的反编译版本是这样的:

    GroupRealm gr = (GroupRealm)realm.where(GroupRealm.class).equalTo("id", g.GroupId).findFirst();
    if(gr == null) {
    gr = (GroupRealm)realm.createObject(GroupRealm.class, g.GroupId);
    }

    String var7 = g.GlyphUrl;
    gr.realmSet$imageUrl(var7);
    var7 = g.Title;
    gr.realmSet$name(var7);
    int var8 = g.OrderNum;
    gr.realmSet$order(var8);

    首先,grGroupRealmRealmProxy 类的实例。如您所见,gr.name 的设置被替换为 gr.realmSet$name(var7)。这意味着从未使用过GroupRealm 的字段namerealmGet$ 的情况类似。

调试时您看到的是您的源代码版本,但实际上您使用的是带有注入(inject)方法 realmSet$realmGet$ 的修改版本。

关于android - 无法从 Realm 对象检索字段值,调试器中的值为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37351703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com