【问题标题】:Firebase saves data as List and sometimes as Map objectFirebase 将数据保存为列表,有时保存为地图对象
【发布时间】:2020-06-03 15:39:29
【问题描述】:

我将带有键的数据保存为数值,其中键是用户尝试的问题。如果用户尝试了所有问题,例如,它可能是连续的。键可能是 0,1,2,3... 这是由 Firebase 保存为数组(如图所示)

JSON 是

"parthgupta48@gmail,com": {
  "attemptedQuestions": [
    {
      "answer": "533",
      "status": "wrong",
      "submissionTime": 1487796702453
    },
    {
      "answer": "9",
      "score": 10,
      "status": "correct",
      "submissionTime": 1487878744867
    },
    {
      "answer": "4",
      "status": "wrong",
      "submissionTime": 1487956858227
    },
    {
      "answer": "3",
      "status": "wrong",
      "submissionTime": 1488056247303
    },
    null,
    {
      "answer": "25",
      "score": 16,
      "status": "correct",
      "submissionTime": 1488212417465
    },
    {
      "answer": "3",
      "status": "wrong",
      "submissionTime": 1488380348815
    },
    null,
    null,
    null,
    {
      "answer": "50",
      "score": 11,
      "status": "correct",
      "submissionTime": 1488648738615
    }
  ],

当键不连续时,例如 0,9,15...当用户仅尝试某些问题时会发生这种情况,然后 Firebase 将其保存为地图(如图所示)

JSON 是

"priyanshu96,goyal@gmail,com" : {
      "attemptedQuestions" : {
        "0" : {
          "answer" : "667",
          "status" : "wrong",
          "submissionTime" : 1487773682189
        },
        "10" : {
          "answer" : "50",
          "submissionTime" : 1488646361162
        }
      },

这是我用来在 Android 中检索数据的代码。

try {
       mCurrentUser = child.getValue(UserObject.class);
    } catch (Exception e) {

       Utils.makeToast("Some Error Occurred ",LoginActivity.this);

   }

userObject 类

public class UserObject implements Serializable {

private String name;
private String uid;
private String email;
private String photoUrl;
private String contact;//bekaar
private long credits;
public Map<String,AttemptedByUserObject> attemptedQuestions;

public void setAttemptedQuestions(Map<String, AttemptedByUserObject> attemptedQuestions) {
    this.attemptedQuestions = attemptedQuestions;
}

public Map<String, AttemptedByUserObject> getAttemptedQuestions() {
    return attemptedQuestions;
}

public long getCredits() {
    return credits;
}

public void setCredits(long credits) {
    this.credits = credits;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPhotoUrl() {
    return photoUrl;
}

public void setPhotoUrl(String photoUrl) {
    this.photoUrl = photoUrl;
}

public String getContact() {
    return contact;
}

public void setContact(String contact) {
    this.contact = contact;
}}

但问题是attemptedQuestions数据保存为列表时需要列表,数据保存为Map时需要Map

我该如何解决这个问题?

【问题讨论】:

  • Firebase 数据模型不太适合存储数组(或 Java List 对象)。见this blog post explaining the behavior you get。不要存储List,而是遵循Firebase documentation's approach for storing collections。这确实会将其存储为地图,这正是正确的方法,因为它可以防止您现在在操作项目时遇到的问题。
  • @FrankvanPuffelen 感谢您的回复,我不想将我的数据保存为列表,但我希望键是数字的,因为它们表示问题编号。有什么方法可以在 android 中获取数据而不管它的存储方式(即映射或数组)
  • 如果你的项目有一个数字键,在它前面加上一个固定的字符串来绕过数组强制。例如。 "question10".
  • 这个解决方案可以在以后使用(当我保存新数据时)。我可以对保存的数据做些什么

标签: android firebase firebase-realtime-database


【解决方案1】:

当使用从零开始的连续键(即 0、1、2 等)保存信息时,您将返回一个列表,在我的情况下,我是从一个开始的,所以由于某种原因它让我返回了一个列表从一个空元素开始。当键不连续时,将返回一个 Map。在了解了这一点后,我最终通过类型检查对其进行了修补,并且由于列表案例中的 null ,我删除了第一个元素。

when (it) {
    is Map<*, *> -> doSomething(it.values.toList() as List<HashMap<String, Any>>)
    is List<*> -> doSomething((it.subList(1,it.size)) as List<HashMap<String, Any>>)
    is Any -> return
}

在示例中,doSomething 仅接受 List&lt;Hashmap&lt;String, Any&gt;&gt; 参数,但变量 it 可以是 Map 或 List。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多