我正在开发一个应用程序,它具有获取用户所有联系人并将其上传到服务器的功能。在这里,我使用Firebase Firestore作为后端。我可以得到所有没有重复的联系人。在需要保存用户的联系信息时,我需要哪种文档结构可以提供帮助吗?请告诉我适当的格式,以免在Firestore中占用太多空间。
然后..
保存所有联系人后,我必须能够使用用户输入的号码来获取联系人的姓名。这是我的要求。简而言之,我想知道如何为Firestore保存2500个联系人详细信息,以及如何在联系人编号的帮助下读取单个联系人姓名,以及用户在edittext中键入的内容。 (注意:听说我们无法一次保存2500个用户的联系方式,应该使用批处理之类的方式)
我尝试了以下代码,但仅保存了前800个联系人。
`private void doUploadContactstoCloud() {
dialog.setCancelable(false);
dialog.setMessage("Please wait we are configuring your request ...");
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.show();
listContacts = new ContactPresenter(this).fetchAllContacts();
int j = listContacts.size();
Log.d("sizejhfg",j+"");
double size = listContacts.size();
double ind = 0;
Map<String, Object> contact = new HashMap<>();
// Get a new write batch
WriteBatch batch = db.batch();
for (Contact con : listContacts) {
for (int i = 0; i < con.numbers.size(); i++) {
String number = formatnum(con.numbers.get(i).number);
if (number != null) {
if (!number.equals("0") && number.length() < 5) {
Map<String, Object> contactnumber = new HashMap<>();
contactnumber.put("name", con.name);
contactnumber.put("number", number);
contact.put(number,contactnumber);
DocumentReference item = db.collection(tonumber).document(number);
batch.set(item,contactnumber);
ind++;
if(ind==500){
doCommit(batch);
batch=db.batch();
ind=0;
}
}
}
}
//dialog.setProgress((int) (ind / size) * 100);
}
if(ind>0){
doCommit(batch);
}
prefManager.setisContactUpload(true);
doDismissDialog();
}`
答案 0 :(得分:2)
- 请告诉我如何将数据保存在Firestore(结构)中
如果您使用身份验证,则应用程序用例的可能数据库架构可能是:
Firestore-root
|
--- users (collection)
|
--- uid (document)
|
--- // user properties
|
--- contacts (subcollection)
|
--- contactId (document)
|
--- phoneNumber: 123456789
|
--- // other contact properties
要获得用户拥有的所有联系人,只需在联系人引用上附加一个侦听器即可:
db.collection("users").document(uid).collection("contacts");
- 请告诉我在号码的帮助下读取单个联系人的姓名
要获取具有电话号码的单个联系人的详细信息,请使用以下查询:
db.collection("users").document(uid).collection("contacts").whereEqualTo("phoneNumber", 123456789);
根据有关maximum number of documents that can be added in single batch的官方文档:
每笔交易或批量写入最多可写入500个文档。
因此,您必须将联系人分成500个文档,才能将所有这些联系人添加到Firestore。
编辑:
如果我假设一个用户的手机中有4000个联系人(仅手机号和姓名* 4000 = 8000个来自单个用户的数据)。
那是不正确的,如果您只有2个属性(在联系人文档中),则您将只有4000个写操作,而不是 8000个,因为这两个属性都属于同一文档。因此,您必须使用批写或POJO类将它们一起编写。
如果用户数量达到500万,那么将需要在Firestore中存储大量数据。
是正确的,但同时这意味着您将拥有一个非常成功的应用程序,并且您可以负担所有这些写操作。 500万人相信我,很多。
所以我想要一个架构最好的架构,应该尽可能少地容纳空间
问题不在于空间,而是与您执行的读写次数有关。 Firestore中的Evrything与读写次数有关。
我期望一种非常有效的数据保存方式。请帮助
根据我的看法,以上架构可以帮助您解决问题。
考虑到这一点,您的答案仍然是最佳解决方案?
考虑您的问题和评论,是的。
是否可以忽略uid,联系人id并且仅具有这些参数
仅当您使用Firebase realtime database(这是另一种产品)时。没有集合和文档,只有JSON数据库结构。