领域查询的奇怪行为

Strange behviour of realm query

我正在制作一个应用程序,用户表示为 RealmObject,当用户登录时,我有一些代码来检查用户是否已经存在,或者是否需要根据 ID 创建该用户。

 public class User extends RealmObject {
     @PrimaryKey
     public String id;

     public User(String id) {
         this.id = id;
     }

检查用户是否存在的代码:

public void checkUser(final HashMap<String, String> data) {
    config = new SyncConfiguration.Builder(syncUser, Constants.realmUri)
                    .schemaVersion(0)
                    .build();
    Realm.getInstanceAsync(config, new Realm.Callback() {
        @Override
        public void onSuccess(@NonNull Realm realm) {
            AuthActivity.this.realm = realm;

            // Check if user already exist
            RealmQuery<User> query = realm.where(User.class);
            query.equalTo("id", data.get("id"));

            // Execute the query
            User u = query.findFirst();
            if (u == null) {
                createUser(data);
                Log.i("RealmHelper", "User did not exist");
            } else {
                if (u.isValid()) {
                    AuthActivity.this.userId = u.id;
                    startActivityMain();
                    Log.i("RealmHelper", "User did exist");
                }
            }
        }
    });
}

Constants.realmUri 等于我服务器的 ip 和端口的字符串。

现在如果用户存在,上面的代码显然应该记录用户确实存在。问题是我得到了正确的行为,但是如果我创建用户,进入应用程序,关闭应用程序然后删除应用程序数据,checkUser() 方法将 return 尝试时用户不存在下次登录。我怀疑这与本地和远程领域有关,并且 checkUser() 方法中使用的领域在某种程度上是本地的而不是远程的。

尽管 checkUser() 说该用户不存在,但该用户在 Realm Studio 中可见并保存在同步数据库中,因为它没有被更改。

id in User is coming from Facebook and the value remains the same that makes this problem even weird.

我通过在 SyncConfiguration 中使用 waitForInitialRemoteData() 设法解决了这个问题。这可确保清除应用数据后领域不为空。