【问题标题】:Arraylist of String not being created in firebase未在 Firebase 中创建字符串的 Arraylist
【发布时间】:2019-07-05 17:08:33
【问题描述】:

我正在尝试在Firebase 中创建一个具有 4 个字段的新用户 1.用户名 2.posts 3.追随者 4.关注 --> ArrayList

下面是ArrayList,但最后一个字段根本没有在 Firebase 中创建。

这是我得到的结果:

创建新用户的代码:

UserBean userBean = new UserBean(mUsername.toLowerCase(),0,0,new ArrayList<String>());
mUserDatabase.push().setValue(userBean);

我的用户Bean:

String username;
int followers,post;
ArrayList<String> following;

public UserBean() {}

public UserBean(String username, int followers, int post, ArrayList<String> following) {
    this.username = username;
    this.followers = followers;
    this.post = post;
    this.following = following;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public int getFollowers() {
    return followers;
}

public void setFollowers(int followers) {
    this.followers = followers;
}

public int getPost() {
    return post;
}

public void setPost(int post) {
    this.post = post;
}

public ArrayList<String> getFollowing() {
    return following;
}

public void setFollowing(ArrayList<String> following) {
    this.following = following;
}

我也尝试将数据添加到ArrayList,但数据没有添加到Firebase。这是我尝试过的:

 Query currentUserQuery = mUsersReference.orderByChild("username").equalTo(mFirebaseAuth.getCurrentUser().getDisplayName().toLowerCase());
 Log.d(MainActivity.TAG,mFirebaseAuth.getCurrentUser().getDisplayName().toLowerCase());


currentUserQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            for(DataSnapshot data: dataSnapshot.getChildren()){
                                ArrayList<String> following = (ArrayList<String>) data.child("following").getValue();
                                following.add(username);
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

ArrayList&lt;String&gt; following = (ArrayList&lt;String&gt;) data.child("following").getValue(); 这行代码抛出NullPointerException 但它应该在列表中添加数据,因为你们说列表只是没有任何数据就不会显示。那为什么会抛出NullPointerException?

【问题讨论】:

  • 在将数据添加到数据库之前,您是否尝试将一些数据添加到 ArrayList?

标签: java android firebase arraylist firebase-realtime-database


【解决方案1】:

据我了解,如果其中没有元素,firebase 不会创建数组项。如果您在列表中添加一个元素,您将在 firebase 中看到它。

【讨论】:

  • 我尝试添加数据,但无法在 firebase 的 arraylist 中推送数据。我已经更新了我的帖子,请看一下。
  • 将项目添加到列表后,您必须再次存储它。 dataSnapshot.getRef().setValue(dataSnapshot.getValue())
  • ArrayList&lt;String&gt; following = (ArrayList&lt;String&gt;) data.child("following").getValue(); 这行代码抛出NullPointerException 但它应该已经在列表中添加了数据,因为你们说列表没有任何数据就不会显示。那为什么会抛出NullPointerException?
  • 上面的代码只是从已经查询的快照中检索数组。将值添加到内存列表后,您还必须将其保存在 firebase 上。为此,您必须使用 setValue。
  • 但是第一次怎么添加数据呢?不在创建列表时。
【解决方案2】:

显然,@Vinay Avasthi 是对的,Firebase 不会在数据库中显示空的 ArrayList,因此如果您正在初始化对象并在构造函数中传递空的 ArrayList,那么 ArrayList 不会出现在Firebase,这进一步给您带来了另一个问题;将来,如果您想在列表中添加数据,则不能这样做,因为它会为您提供NullPointerException,因此要解决所有这些问题,我必须通过ArrayList 传递一个空的String 然后我可以在firebase 中显示List 并轻松引用它。

ArrayList<String> following = new ArrayList<>();
following.add("");
UserBean userBean = new UserBean(mUsername.toLowerCase(),0,0,following);
mUserDatabase.push().setValue(userBean);

还有一点需要注意,@Vinay Avasthi 也指出,您还必须将列表的值再次设置为新列表,否则您将在列表中添加数据但数据不会更新在Firebase.

ArrayList<String> following = (ArrayList<String>) data.child("following").getValue();
following.add(username);
String key = data.getKey();                   
mUsersReference.child(key).child("following").setValue(following);

但我仍然面临一个问题,即在每个列表中,您将有一个空的 String,而您对此没有用处。

现在,我将忽略空的String,同时向用户显示他们的followings。但我认为firebase 应该创建了空的ArrayList。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2020-09-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多