【发布时间】:2019-03-14 02:07:17
【问题描述】:
我正在使用 firebase 实时数据库,并将字符串列表存储在特定的存储引用中。目前,添加一些东西到列表中
我正在执行以下步骤。
- 读取数据库子引用
- 获取数据快照并检查它是否为空(这意味着首先 时间)
- 如果为null,直接设置你的本地列表
-
如果
dataSnapshot.getValue();不为空,则(已存在数据 db,因此需要将新数据附加到它的末尾。) 将远程列表从dataSnapshot.getValue();保存到本地变量。然后将新数据添加到它的末尾
- 现在本地列表包含远程和新的所有项目 项目。将此保存到子参考
下面是我为此编写的代码
DatabaseReference reference = root()
.child(userId)
.child(list_id);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
reference.removeEventListener(this);
List<String> value = new ArrayList<>();
if (dataSnapshot.getValue() == null) {
value.add(message);
} else {
if (dataSnapshot.getValue() instanceof List && ((List) dataSnapshot.getValue()).size() > 0 && ((List) dataSnapshot.getValue()).get(0) instanceof String) {
value = (List<String>) dataSnapshot.getValue();
value.add(message);
}
}
reference.setValue(value, (databaseError, databaseReference) -> {
finish();
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
finish();
}
private void finish() {
Log.e(TAG,"save finished");
}
});
做一个简单的操作有很多步骤。此外,我一直在从远程提取整个数据并将新数据附加到它。
有什么简单的方法可以做到这一点吗?我尝试使用 'push()' 方法如下
DatabaseReference reference = root()
.child(userId)
.child(list_id).push();
但它总是为我添加的值添加一个新键。谁能用更少的代码解释什么是正确的方法?
更新:
我的db结构如下图
【问题讨论】:
-
请添加您的数据库结构。
-
它是一个简单的字符串列表层次结构,正如您在代码中看到的那样
root() .child("list") .child(list_id);root()将返回用户根节点的引用,其中包含一个名为list的键它持有一个键值对,键为字符串,值List<String> -
基本上
root()会返回用户root 裁判。它在每个日期都有用户 cmets,其中 dateString 是每个列表的键。希望你理解结构 -
与其解释数据库的外观,不如添加 JSON 格式的结构或至少一个屏幕截图。
-
@AlexMamo 数据库结构图片已添加
标签: android firebase firebase-realtime-database