未在 Firebase 中创建字符串的 Arraylist
Posted
技术标签:
【中文标题】未在 Firebase 中创建字符串的 Arraylist【英文标题】:Arraylist of String not being created in firebase 【发布时间】: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<String> following = (ArrayList<String>) data.child("following").getValue();
这行代码抛出NullPointerException
但它应该在列表中添加数据,因为你们说列表只是没有任何数据就不会显示。那为什么会抛出NullPointerException
?
【问题讨论】:
在将数据添加到数据库之前,您是否尝试将一些数据添加到 ArrayList? 【参考方案1】:据我了解,如果其中没有元素,firebase 不会创建数组项。如果您在列表中添加一个元素,您将在 firebase 中看到它。
【讨论】:
我尝试添加数据,但无法在 firebase 的 arraylist 中推送数据。我已经更新了我的帖子,请看一下。 将项目添加到列表后,您必须再次存储它。dataSnapshot.getRef().setValue(dataSnapshot.getValue())
ArrayList<String> following = (ArrayList<String>) 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
。
【讨论】:
以上是关于未在 Firebase 中创建字符串的 Arraylist的主要内容,如果未能解决你的问题,请参考以下文章
未在 Xamarin 应用程序 (Android) 中创建目录
未在 mongoengine 中创建与新 dbname 的连接