Android Firebase 查询问题
Android Firebase Query Issue
数据样本:
{
"families" : {
"4039738864" : {
"2019-11-09" : {
"-LtGOEjR-u_RKbXCiO2d" : {
"messageDate" : "2019-11-09",
"messageText" : "Test 1",
"messageTime" : "11:20",
"messageUser" : "dadio"
},
"-LtI2urxYkILHrYZdtmv" : {
"messageDate" : "2019-11-09",
"messageText" : "Hey man how is it going?",
"messageTime" : "19:06",
"messageUser" : "dadio"
},
基本上是创建当天的消息对象列表。我想要的是撤回 10 天的消息(最近 10 天)。
我试过这个查询:
Query query = familyRef.child(familyKey).orderByKey().startAt(startDate).endAt(endDate).limitToLast(10);
adapter = new FirebaseRecyclerAdapter<ChatMessage, ChatHolder>(options) {
@NonNull
@Override
public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_item, parent, false);
return new ChatHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ChatHolder chatHolder, int i, @NonNull ChatMessage chatMessage) {
//TODO: .toLocalDateTime() all dates
但这确实会拉回子对象只是实际的日期节点。
有什么想法吗?
您可以获得单个日期的数据,例如
Query query = familyRef.child(familyKey).orderByKey().whereEqualTo("startDate", startDate).limitToLast(10);
你所描述的听起来像是我预期的行为。 FirebaseUI 适配器处理与您传入的查询相匹配的子节点。
由于您将 /families/$familyid
上的查询传递给适配器,因此会为每个匹配的子项(即日期)实例化一个视图持有者。
如果您想显示两个日期之间的消息列表,您当前的数据结构不适合此操作。相反,请考虑像这样存储您的数据:
"families" : {
"4039738864" : {
"-LtGOEjR-u_RKbXCiO2d" : {
"messageDate" : "2019-11-09",
"messageText" : "Test 1",
"messageTime" : "11:20",
"messageUser" : "dadio"
},
"-LtI2urxYkILHrYZdtmv" : {
"messageDate" : "2019-11-09",
"messageText" : "Hey man how is it going?",
"messageTime" : "19:06",
"messageUser" : "dadio"
},
"-LtI2urxYkILHrYZdtmx" : {
"messageDate" : "2019-11-10",
"messageText" : "Totes good!",
"messageTime" : "09:11",
"messageUser" : "puf"
},
在上面的重组数据中,我从您的 JSON 中删除了 "date" 级别。由于您在每条消息中已经有了日期,因此不会丢失任何数据,您现在可以使用 FirebaseUI 实现您的用例。
使用此数据结构,您可以查询与以前相同的日期范围:
Query query = familyRef.child(familyKey).orderByChild("MessageDate").startAt(startDate).endAt(endDate).limitToLast(10);
如果您不想重组数据,则必须创建自定义适配器来处理用例。您需要将自己的侦听器附加到数据结构,解析来自 DataSnapshot
的每一天的消息,并更新适配器中的数据。
数据样本:
{
"families" : {
"4039738864" : {
"2019-11-09" : {
"-LtGOEjR-u_RKbXCiO2d" : {
"messageDate" : "2019-11-09",
"messageText" : "Test 1",
"messageTime" : "11:20",
"messageUser" : "dadio"
},
"-LtI2urxYkILHrYZdtmv" : {
"messageDate" : "2019-11-09",
"messageText" : "Hey man how is it going?",
"messageTime" : "19:06",
"messageUser" : "dadio"
},
基本上是创建当天的消息对象列表。我想要的是撤回 10 天的消息(最近 10 天)。
我试过这个查询:
Query query = familyRef.child(familyKey).orderByKey().startAt(startDate).endAt(endDate).limitToLast(10);
adapter = new FirebaseRecyclerAdapter<ChatMessage, ChatHolder>(options) {
@NonNull
@Override
public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_item, parent, false);
return new ChatHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ChatHolder chatHolder, int i, @NonNull ChatMessage chatMessage) {
//TODO: .toLocalDateTime() all dates
但这确实会拉回子对象只是实际的日期节点。
有什么想法吗?
您可以获得单个日期的数据,例如
Query query = familyRef.child(familyKey).orderByKey().whereEqualTo("startDate", startDate).limitToLast(10);
你所描述的听起来像是我预期的行为。 FirebaseUI 适配器处理与您传入的查询相匹配的子节点。
由于您将 /families/$familyid
上的查询传递给适配器,因此会为每个匹配的子项(即日期)实例化一个视图持有者。
如果您想显示两个日期之间的消息列表,您当前的数据结构不适合此操作。相反,请考虑像这样存储您的数据:
"families" : {
"4039738864" : {
"-LtGOEjR-u_RKbXCiO2d" : {
"messageDate" : "2019-11-09",
"messageText" : "Test 1",
"messageTime" : "11:20",
"messageUser" : "dadio"
},
"-LtI2urxYkILHrYZdtmv" : {
"messageDate" : "2019-11-09",
"messageText" : "Hey man how is it going?",
"messageTime" : "19:06",
"messageUser" : "dadio"
},
"-LtI2urxYkILHrYZdtmx" : {
"messageDate" : "2019-11-10",
"messageText" : "Totes good!",
"messageTime" : "09:11",
"messageUser" : "puf"
},
在上面的重组数据中,我从您的 JSON 中删除了 "date" 级别。由于您在每条消息中已经有了日期,因此不会丢失任何数据,您现在可以使用 FirebaseUI 实现您的用例。
使用此数据结构,您可以查询与以前相同的日期范围:
Query query = familyRef.child(familyKey).orderByChild("MessageDate").startAt(startDate).endAt(endDate).limitToLast(10);
如果您不想重组数据,则必须创建自定义适配器来处理用例。您需要将自己的侦听器附加到数据结构,解析来自 DataSnapshot
的每一天的消息,并更新适配器中的数据。