简体   繁体   English

在 Firebase 数据库中保存 ArrayList

[英]Save ArrayList in Firebase Database

I am building a mobile messaging application,我正在构建一个移动消息传递应用程序,

I want to create a chat group where the user selects the members using a checkbox then save the identifiers of the selected users in a list which will be saved in the Firebase database,我想创建一个聊天组,用户可以在其中使用复选框选择成员,然后将所选用户的标识符保存在一个列表中,该列表将保存在 Firebase 数据库中,

The problem that my application crash when I want to save the users to the database当我想将用户保存到数据库时我的应用程序崩溃的问题

My logcat:我的日志:

com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.lang.String com.google.firebase.database.DatabaseException:反序列化时需要一个列表,但得到了一个类 java.lang.String

Code:代码:

 private void CreateNewGroup(final String groupName) {
        groupNameRef = FirebaseDatabase.getInstance().getReference().child("Groups");

        DatabaseReference push = groupNameRef.push();
        String push_id = push.getKey();


        assert push_id != null;
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Groups").child(push_id);

        Map<String, String> hasMap = new HashMap<>();
        hasMap.put("groupName", groupName);
        hasMap.put("Admin", firebaseUser.getUid());
        hasMap.put("members", "");
        ref.setValue(hasMap).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Toast.makeText(SelectGroupActivity.this, "Saved" + groupName, Toast.LENGTH_SHORT).show();
            }
        });


        DatabaseReference ref2 = FirebaseDatabase.getInstance().getReference("Groups" + "/" +
                push_id + "/" + "members");

        SharedPreferences myPref2 = SelectGroupActivity.this.getSharedPreferences("data2", Context.MODE_PRIVATE);
        Set<String> set1 = myPref2.getStringSet("key2", null);

        assert set1 != null;
        ArrayList<String> namesList = new ArrayList<>(set1);
        ref2.setValue(namesList).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task)
            {
               if(task.isSuccessful())
            {
                Toast.makeText(SelectGroupActivity.this, "Success", Toast.LENGTH_SHORT).show();
            }
            }
        });
    }

And my Model class还有我的模特课

import java.util.List;

public class Groups
{
    private String groupName;
    private List<String> members;
    private String Admin;

    public Groups() {}

    public Groups(String groupName, List<String> members, String Admin) {
        this.groupName = groupName;
        this.members = members;
        this.Admin = Admin;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public List<String> getMembers() {
        return members;
    }

    public void setMembers(List<String> members) {
        this.members = members;
    }

    public String getAdmin() {
        return Admin;
    }
    public void setAdmin(String admin) {
        Admin = admin;
    }
}

Database:数据库:

在此处输入图像描述

You can't store arrays in firebase.您不能在 Firebase 中存储数组。 It's either you restructure your database or you store members in string form like MemberA, MemberB, MemberC or their id's respectively.要么重组数据库,要么分别以字符串形式存储成员,例如MemberA, MemberB, MemberC或它们的 ID。 So you can do set the members value like below.所以你可以像下面这样设置成员值。

ArrayList<String> namesList = new ArrayList<>(set1);
String strNameList = "";
for (int i = -; i < namesList.size(); i++) {
    strNameList += namesList[i] + ",";
}

ref2.setValue(strNameList);

Or you can restructure your db.或者你可以重组你的数据库。 I personally recommend this.我个人推荐这个。

groups
   groupA
      admin

members
   groupA
      0: "Alpha"
      1: "Bravo"

So if you want to know the members of groupA then you can do this.所以如果你想知道 groupA 的成员,那么你可以这样做。

// considering that you have the group name value
// Ex. groupA
database.child("members").child("groupA"). addValueEventListener(...)

You can check documentation here on how to structure your data您可以在此处查看有关如何构建数据的文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM