我正在尝试迁移我构建的应用程序,该应用程序使用 Parse 作为其云后端。在我的 Parse 后端数据库中,我有一个存储数据的表,如下所示:
Device ID | Contacts
xxxxx001 | "(800)-888-8888"
xxxxx002 | "(800)-888-8858"
xxxxx003 | "(800)-888-8868"
在这里,设备 ID 是 android 设备 ID,联系人是通过设备上的逻辑生成的字符串 ArrayList。基本上,用户会选择一个联系人(在未来的迭代中会选择多个联系人,因此它是一个 ArrayList,为了测试我只在列表中保留一个项目)并且该联系人会为后端数据库中的那个 DeviceID 保存。如果同一个 DeviceID 更改了联系人,则数据库中与其 DeviceID 对应的联系人 ArrayList 将替换为新的 ArrayList。
我正在尝试在 Firebase 上进行类似的设置,但是现在我的数据库中似乎只有一个全局变量,每次我按下按钮时它似乎都会更新。
这是我的按钮代码:
DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mContactsRef = mRootRef.child("contacts");
@Override
protected void onStart() {
super.onStart();
mButtonContactSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mContactsRef.setValue(contacts); //contacts is an arraylist with 1 item
}
});
}
这是点击按钮 3 次后在 Firebase 中的样子:
不是更新值,它似乎添加了另一行(?)来存储当前选择的电话号码
。如何设置 DeviceID->(每个设备要存储的对象)
某种设置?
最佳答案
您正在寻找 push()
,它会为新项目生成一个唯一 ID。
来自Firebase documentation on reading and writing lists of data :
// Create a new post reference with an auto-generated id
var newPostRef = postListRef.push();
newPostRef.set({
// ...
});
新项目将具有 -KTTHEScy82fpfNSCoYN
形式的复杂键。阅读此 article on why those are preferred over array indices和(如果你感兴趣的话)这个 article that explains the format of these keys .
考虑一个不同的数据模型
一般来说,您可能想要考虑不同的数据模型。您存储的是一组电话号码。乍一看,将它们存储在类似数组的列表中似乎很好。
但通常您会希望此联系人列表具有以下行为:
- 每个电话号码只能出现一次
- 您需要查找给定的电话号码是否已经在列表中
使用您当前的结构,您只能通过扫描列表中的所有项目来查看列表中是否已经有一个数字。每当出现这种情况时,都是考虑改用集合数据结构的好时机。
在 Firebase 中,您可以像这样对一组电话号码进行建模:
"contacts": {
"(800)-888-8858": true
"(800)-888-8868": true
"(800)-888-8888": true
}
虽然这种结构最初看起来效率较低,但实际上它比 Firebase 中的数组列表存储效率更高。现在查找一个项目是否存在是一个简单的存在检查,而不是必须扫描数组。并且使用这种结构不可能将相同的数字存储两次。
关于android - 在 Firebase 中为每个设备保存特定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938454/