我正在制作一个Android应用,该应用可以让用户通过输入电话号码来查询数据库。返回的搜索带有与电话号码链接的用户名,非常类似于truecaller。
这是Firestore数据库结构当前的样子:
collection(“ contact”)---文档(自动生成的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) {
}
});
如何最好地保存搜索电话号码的搜索者的用户名,以便每当有人搜索其电话号码时都可以通知电话号码的所有者?它应该看起来像这样:
collection(“联系人”)---文档(自动生成的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) {
}
});
database photo1 database photo2
第二个屏幕截图可能看起来令人困惑……这是因为字段是按字母顺序排列的。搜索器字段是一种数组类型,到目前为止,它的含义是大约有3个用户名,但它会不断删除前一个用户名,并用最新的用户名替换,这就是为什么它仍然只包含一个用户ID的原因。
答案 0 :(得分:0)
由于您使用的是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