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

【问题讨论】:

在将数据添加到数据库之前,您是否尝试将一些数据添加到 ArrayList? 【参考方案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

【讨论】:

以上是关于未在 Firebase 中创建字符串的 Arraylist的主要内容,如果未能解决你的问题,请参考以下文章

未在 Xamarin 应用程序 (Android) 中创建目录

未在 Azure 中创建 Spring Boot 会话

未在 mongoengine 中创建与新 dbname 的连接

Filebeat 未在 Elasticsearch 中创建索引

由于语法错误表未在 DB 中创建

未在 LOGS 文件夹中创建 ULS 日志