【问题标题】:Query Firebase list with object value使用对象值查询 Firebase 列表
【发布时间】:2017-07-15 17:21:51
【问题描述】:

您好,我正在使用DatabaseReference#push 方法将对象添加到引用。 此对象具有属性 ID。 下次我有 id 并且我希望从该列表中获取该用户对象时,我该如何获取它。我有任何简单的方法可以直接查询,或者我们需要提取所有对象并将每个 id 与我需要的进行比较, 这是我的目标代码

@IgnoreExtraProperties
public final class User {

    private Integer id;
    private String name;
    private String secret;

    public User() {

    }

    public User(Integer id, String name, String secret) {
        this.id = id;
        this.name = name;
        this.secret = secret;
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getSecret() {
        return secret;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }
}

这就是我将它添加到 firebase 控制台 mReference.push().setValue(user); 的方式,我也想知道我们可以省略节点的随机生成的 id,因为我不会拥有那个 kp*** id,而是我会拥有用户对象的id

她是我尝试查询更多代码的方式:)

public final class UserReference implements ChildEventListener {

    private static final String TAG = UserReference.class.getSimpleName();

    private static final List<User> userList = new ArrayList<>();

    static {
        userList.add(new User(1, "user1", "secret1"));
        userList.add(new User(2, "user2", "secret2"));
    }

    private static final String USER = "users";
    private final DatabaseReference mReference;
    private Query mSingleUserQuery;

    UserReference(FirebaseDatabase database) {
        mReference = database.getReference(USER);
//        mReference.addChildEventListener(this);
    }

    //One time use method
    public void saveUser() {
        for (User user : userList) {
            mReference.push().setValue(user);
        }
    }

    public void findUserById(final String id, final OnDbCompleteListener<User> userListener) {
        mSingleUserQuery = mReference.orderByChild("id").equalTo(id);
        mSingleUserQuery.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Logger.info(TAG, "Key: " + dataSnapshot.getValue());
                sendDataAndUnregister(dataSnapshot);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                Logger.info(TAG, dataSnapshot.getKey());
                sendDataAndUnregister(dataSnapshot);
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                Logger.info(TAG, dataSnapshot.getKey());
                sendDataAndUnregister(dataSnapshot);
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                Logger.info(TAG, dataSnapshot.getKey());
                sendDataAndUnregister(dataSnapshot);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                databaseError.toException().printStackTrace();
            }

            private void sendDataAndUnregister(DataSnapshot dataSnapshot) {
                mSingleUserQuery.removeEventListener(this);
                userListener.onComplete(dataSnapshot.getValue(User.class));
            }
        });

    }

    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Logger.info(TAG, "added: " + dataSnapshot.getKey());
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        Logger.info(TAG, "changed: " + dataSnapshot.getKey());
    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        Logger.info(TAG, "removed: " + dataSnapshot.getKey());
    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        Logger.info(TAG, "moved: " + dataSnapshot.getKey());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Logger.info(TAG, "Error: " + databaseError.getMessage());
    }
}

数据库类

public final class MySuperCoolDatabase {

    private FirebaseDatabase mDatabase;
    private UserReference mUserReference;

    public MySuperCoolDatabase() {
        mDatabase = FirebaseDatabase.getInstance();
        mUserReference = new UserReference(mDatabase);
    }

    public UserReference getUserReference() {
        return this.mUserReference;
    }
}

它的召唤:

MySuperCoolDatabase database = new MySuperCoolDatabase();
        UserReference userReference = database.getUserReference();
        userReference.findUserById("1", new OnDbCompleteListener<User>() {
            @Override
            public void onComplete(User user) {
                Logger.info(TAG, "YAYA");
            }
        });

DbUpdateListener:

public interface OnDbCompleteListener<T> {

    void onComplete(T t);
}

【问题讨论】:

  • ref.orderByChild("id").equalTo(1).addChildEventListener(...
  • @FrankvanPuffelen 感谢您的回复,我已经用所有必要的课程更新了我的问题,但仍然无法正常工作:'(
  • 它成功了,我错过了基本数据类型木乃伊:'(@FrankvanPuffelen

标签: android list firebase search firebase-realtime-database


【解决方案1】:

感谢@FrankvanPuffelen,我必须进行以下更改,因为我将 id 存储为整数,所以我应该只请求整数。

public void findUserById(final Integer id, final OnDbCompleteListener<User> userListener) {
        mSingleUserQuery = mReference.orderByChild("id").equalTo(id);
...
}

来自

public void findUserById(final String id, final OnDbCompleteListener<User> userListener) {
        mSingleUserQuery = mReference.orderByChild("id").equalTo(id);

...
}

除此之外,我还必须按照 firebase 战争记录器在控制台中的建议添加索引,这里是规则文件

{
    "rules": {
        ".read": true,
        ".write": false,
        "users": {
            ".indexOn": "id"
        }
    }
}

【讨论】:

    【解决方案2】:

    要将值直接推入节点,您可以使用 -

       User user = "detail of your user";
       // On firebase reference push value on id directly.
       ref.child("1").setValue("user);
    

    这里的“1”是一个 id,它将成为您的用户详细信息的主键。

    更新 -

    public void saveUser() {
        for (User user : userList) {
            mReference.child(user.id).setValue(user);
        }
    }
    

    【讨论】:

    • 我的代码 sn-p 只是一个示例,您必须用用户的实际详细信息替换“用户详细信息”并使用正确的 firebase 参考
    • 组合用户对象是错误的,请检查上面我是如何组合它的,现在问题已经解决了
    • 如果你会按照这个sn-p,你不需要搜索id。可以直接点id。
    • @sector11,我已经更新了 sn-p,请检查并告诉我它是否有效。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多