【问题标题】:Save ArrayList in Firebase Database在 Firebase 数据库中保存 ArrayList
【发布时间】:2019-04-19 11:09:44
【问题描述】:

我正在构建一个移动消息应用程序,

我想创建一个聊天组,用户使用复选框选择成员,然后将所选用户的标识符保存在一个列表中,该列表将保存在 Firebase 数据库中,

当我想将用户保存到数据库时我的应用程序崩溃的问题

我的日志猫:

com.google.firebase.database.DatabaseException:反序列化时需要一个列表,但得到一个类 java.lang.String

代码:

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

还有我的模型课

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

数据库:

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您不能在 firebase 中存储数组。要么重组数据库,要么分别以字符串形式存储成员,如MemberA, MemberB, MemberC 或它们的id。所以你可以像下面这样设置成员值。

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

    或者你可以重组你的数据库。我个人推荐这个。

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

    因此,如果您想知道 groupA 的成员,那么您可以这样做。

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

    您可以查看文档here,了解如何构建数据

    【讨论】:

    • 请您解释一下第二种解决方案(我的哈希集包含我要存储的已检查用户的 ID)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多