java - Realm findFirst() 方法返回 null

标签 java android realm

我搜索并找到了FindFirst returns null问题,但没有人回答。当我认为我做错了什么时,让我用更多的细节来解释我的问题。

我正在开发一款应用,它要求用户先登录,然后让用户使用该应用。

我的 User 类如下所示:

public class User extends RealmObject {

    @PrimaryKey
    @SerializedName("uid")
    String id;
    @SerializedName("ufname")
    String firstName;
    @SerializedName("ulname")
    String lastName;
    String avatar;
    int sessions;
    int invites;
    String nextSessionTime;
    String nextSessionTitle;
    @SerializedName("lastlogin")
    String lastLogin;
    String token;

    @Override
    public String toString() {
        return new GsonBuilder().create().toJson(this, User.class);
    }

    // other setters and getters
}

SigninActivity 类中成功登录后,我将用户对象存储在 Realm 数据库中:

@Override
public void onSignInResponse(final GeneralResponse response) {

    if (response == null) {
        Timber.e("response is null");
        return;
    }
    Timber.d(response.toString());

    if (response.isSuccess()) {
        // Store user's info including Token
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.copyToRealmOrUpdate(response.getUser());
            }
        });

        // Goto main screen
        MainVideoActivity.startActivity(this);
        this.finish();

    } else {
        String errorMessage = response.getErrorMessages();
        super.displayMessage(errorMessage);
    }
}

登录成功后,应用会将用户定向到 MainVideoActivity。我想通过以下代码在 Realm 中找到用户,但是我得到的是 null

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main_video);

    // Create the Realm instance
    realm = Realm.getDefaultInstance();
    User user = realm.where(User.class).findFirst();
//        RealmResults<User> user = realm.where(User.class).findAll();
    Timber.d(user.toString());
}

user 在这两种方法中都是 null

enter image description here

但是,我可以在数据库中看到我的 none null 用户。

enter image description here

我正在使用 classpath "io.realm:realm-gradle-plugin:2.0.2"

最佳答案

这里有两件事:

  1. 调试窗口中的 null 值。这是将 Realm 与调试器一起使用时的已知限制。由于 Realm 生成了一个代理类来访问值,因此在调试器中检查 RealmObject 的字段不会通过代理类。查看更多详情 here

  2. 具有null 值的字段不会在toString() 方法中打印。如果 RealmObject 中没有定义 toString() 方法,Realm 注释处理器将生成一个 toString() 方法。我认为这里的问题是 User.toString() 忽略了空值。尝试删除 User 类中的 toString() 方法。

关于java - Realm findFirst() 方法返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065366/

相关文章:

java - ViewPager.setAdapter() 抛出 NullPointException; viewPager 和 pagerAdapter 似乎不为空?

android - 如何正确使用Realm

ios - 在不重新启动应用程序的情况下更改 Realm 文件

android - 使用 addRealmObjectField 添加新架构时出现 RealmMigrationNeededException

java - 在 Java 中通过代理连接 MySQL

java - jdom2 并从 URI 读取 xml 字符串而不是文件

java - 如何通过 ssl 发送请求?

java - 如何将 ComboBox.SelectedItem() 转换为 int?

android - 'armeabi' 是 32 位还是 64 位?

安卓应用更新机制