java - 如何从 Android 应用程序向查询的 Firestore (autoID) 文档添加全新字段
问题描述
我正在制作一个 Android 应用程序,允许用户通过输入电话号码来查询数据库。搜索返回的用户名与电话号码相关联,很像 truecaller。
这是 Firestore 数据库结构当前的样子:
集合(“联系人”)---文档(自动生成的 ID)---(field1(“用户名”),field2(“phoneNum”))
这是我的代码:
CollectionReference collectionReference = db.collection("contact");
Query query = collectionReference.whereEqualTo("phoneNum",phonesearch);
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>(){
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task){
if (task.isSuccessful()) {
for (DocumentSnapshot document:task.getResult()){
username = document.getString("username");
phonenum = document.getString("phonenum");
//storing the searcher username in the database
Map<String, String> Usermap = new HashMap<>();
searcher = user.getDisplayName();
Usermap.put("searcher", searcher);
db.collection("contact").add(Usermap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
}
});
我怎样才能最好地保存搜索电话号码的搜索者的用户名,以便电话号码的所有者可以在有人搜索他们的号码时得到通知?它应该如下所示:
集合(“联系人”)---文档(自动生成的ID)---(field1(“用户名”),field2(“电话号码”),field3(“searcher1”),field4(“searcher2”),.. ...fieldN("searcher3"))
目前它创建了一个全新的文档。我不希望它这样做,我只想将新字段(搜索器)添加到现有文档中。
其他解决方案也将不胜感激。谢谢。
................................................这是更改后的样子,它用最新的搜索者用户名覆盖以前的搜索者用户名,而不是用最新的搜索者用户名更新列表。
Map<String, Object> Usermap = new HashMap<>();
searcher = user.getDisplayName();
Usermap.put("searcher", searcher);
db.collection("contact").document(document.getId()).update(Usermap).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
});
第二个屏幕截图可能看起来令人困惑……这是因为字段是按字母顺序排列的。Searcher 字段是一种数组类型,现在它应该有大约 3 个用户名,但它会不断删除前一个用户名并用最新的用户名替换它,这就是为什么它仍然只有一个用户 ID。
解决方案
它添加了一个新文档,因为您使用的是 CollectionReference 的add()方法:
以指定的 POJO 作为内容向此集合添加一个新文档,并自动为其分配一个文档 ID。
而不是使用 DocumentReference 的update()方法:
更新此 DocumentReference 引用的文档中的字段。
所以为了解决这个问题,请更改以下代码行:
db.collection("contact").add(Usermap).addOnSuccessListener
至
db.collection("contact").document(document.getId()).update(String.valueOf(Usermap), searches).addOnSuccessListener(/* ... */);
要存储这些搜索,我建议您创建另一个名为的对象(地图)searches
并将所有这些搜索存储在它下面。不要将每个搜索存储为单独的属性。您的架构应如下所示:
Firestore-root
|
--- contact (collection)
|
--- autoGeneratedId (document)
|
--- username: "User Name"
|
--- phoneNumber: +123456789
|
--- searches
|
--- searcher1: true
|
--- searcher2: true
还有一种方法可以将所有这些搜索存储到array
. 这是您的数据库结构应如下所示:
Firestore-root
|
--- contact (collection)
|
--- autoGeneratedId (document)
|
--- username: "User Name"
|
--- phoneNumber: +123456789
|
--- searches: ["searcher1", "searcher2"]
请记住,此解决方案只有在您存储有限数量的搜索时才能正常工作。如果您认为文档可以容纳的搜索次数会多得多,在这种情况下,请考虑创建一个搜索集合,如下所示:
Firestore-root
|
--- contact (collection)
|
--- autoGeneratedId (document)
|
--- username: "User Name"
|
--- phoneNumber: +123456789
|
--- searches (collection)
|
--- searcher1 (document)
| |
| --- //details
|
--- searcher2 (document)
|
--- //details
推荐阅读
- go - Confluent go kafka 库从重启时最早的偏移量开始
- javascript - .NET Core 等效于 Uint8ClampedArray
- php - 查询在 PHP 中返回空结果,但在 phpmyadmin 上工作正常
- git - 我可以使用 Github 的 LFS 测试服务器吗?
- php - 页脚后额外的1px白线?
- python - 如何使用 Python 3.6 将图像复制到 PowerPoint?
- c# - WebApi 到 XML 默认访问器的序列化错误
- java - Java 运行时环境检测到致命错误:libjvm.dylib
- gtk - 如何释放 Gtk::Button?
- android - 在不同的活动中测试两个文本