Сохранить ArrayList в базе данных Firebase - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу создать группу чата, в которой пользователь выбирает этих друзей с помощью ckeckbox ... и я сохраню идентификаторы выбранных пользователей в списке, затем хочу сохранить этот список в базе данных firebase в дочернем элементе, но явозникла проблема с аварийным завершением моего приложения.

Мой logcat:

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

База данных:

enter image description here

1 Ответ

0 голосов
/ 19 апреля 2019

Вы не можете хранить массивы в базе данных. Либо вы реструктурируете свою базу данных, либо сохраняете членов в строковой форме, например, MemberA, MemberB, MemberC или их идентификаторы соответственно. Таким образом, вы можете установить значение членов, как показано ниже.

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"

Так что, если вы хотите узнать членов группы А, вы можете сделать это.

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

Вы можете проверить документацию здесь о том, как структурировать ваши данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...