使用对象值查询Firebase列表

时间:2017-07-15 17:21:51

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

您好我正在使用DatabaseReference#push方法将对象添加到引用中。 该对象具有属性id。 下次我有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而是我会是用户对象的havind id Firebase image

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

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);
}

2 个答案:

答案 0 :(得分:0)

要将值直接推送到节点,可以使用 -

   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);
    }
}

答案 1 :(得分:0)

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

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 war logger在控制台中的建议添加索引这里是规则文件

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