使用查询从 Firestore 中高效地检索联系人数据
Retrieve Contact Data From Firestore Efficiently Using A Query
我的要求是,当用户 Mr.ABC 安装应用程序时,它会获取用户的所有联系人并保存到 Firebase Firestore。当另一个用户 Mr.XYZ 在他的设备中安装该应用程序时,它将获取 XYZ 的所有联系人并保存到 Firebase。同样,无论谁安装该应用程序,它都会获取联系人并保存到 Firebase Firestore。现在我的读取操作应该是,Mr.ABC 将在 EditText 和 firebase 中键入 XYZ 号码,我必须查看 XYZ 联系方式并找出 ABC 的号码并获取 XYZ 在他的联系人中保存的名称。这样当ABC输入XYZ号码时,ABC就可以查到XYZ用哪个名字保存了ABC的号码。请帮助我在 firebase 中保存联系人的结构以及如何读取数据。我想知道执行此操作的有效方法。由于我不擅长数据库,因此帮助我编写准确的代码会更有帮助。请帮忙
我试过下面的代码,但只有 800 个联系人存储到 Firestore 而不是 2500 个,而且我不确定我使用的数据库结构是对还是错。我对数据库的了解为零。
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();
}`
这是您问题的可能答案 -
首先,Firestore 数据库结构。我现在将其称为数据库结构。这是一个可能适合您的模板 -
c- Contacts
d- +1 9999999999 //ABC's Phone No.
f- +1 0000000000 : XYZ's Number // XYZ's Saved Name in ABC's Contacts and his phone no.
f- +1 1111111111 : LMN's Number // LMN's Saved Name in ABC's Contacts and his phone no.
d- +1 0000000000 //XYZ's Phone No.
f- +1 9999999999 : ABC's Number //ABC's Saved Name in XYZ's Contacts and his phone no.
f- +1 1111111111 : LMN's Number // LMN's Saved Name in XYZ's Contacts and his phone no.
其次,这是我认为可用于添加和查询数据库的代码 -
Map<String, Object> contacts = new HashMap<>();
contacts.put("+1 0000000000", "XYZ's Number");
contacts.put("+1 1111111111", "LMN's Number");
db.collection("contacts").document("+1 9999999999")
.set(contacts)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully written!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error writing document", e);
}
});
编辑这部分以获得更有效的查询 -
db.collections("contacts").document("+1 9999999999").get(EditTextEnteredNumber)
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot snap : queryDocumentSnapshots) {
Log.d(TAG, snap.getId() + " => " + snap.getData());
TextViewContactName.setText(snap.getData());
}
}
});
希望对您有所帮助!!
来源
官方 Cloud Firestore 文档 - https://firebase.google.com/docs/firestore/?utm_source=studio
SO 文章 -
我的要求是,当用户 Mr.ABC 安装应用程序时,它会获取用户的所有联系人并保存到 Firebase Firestore。当另一个用户 Mr.XYZ 在他的设备中安装该应用程序时,它将获取 XYZ 的所有联系人并保存到 Firebase。同样,无论谁安装该应用程序,它都会获取联系人并保存到 Firebase Firestore。现在我的读取操作应该是,Mr.ABC 将在 EditText 和 firebase 中键入 XYZ 号码,我必须查看 XYZ 联系方式并找出 ABC 的号码并获取 XYZ 在他的联系人中保存的名称。这样当ABC输入XYZ号码时,ABC就可以查到XYZ用哪个名字保存了ABC的号码。请帮助我在 firebase 中保存联系人的结构以及如何读取数据。我想知道执行此操作的有效方法。由于我不擅长数据库,因此帮助我编写准确的代码会更有帮助。请帮忙
我试过下面的代码,但只有 800 个联系人存储到 Firestore 而不是 2500 个,而且我不确定我使用的数据库结构是对还是错。我对数据库的了解为零。
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();
}`
这是您问题的可能答案 -
首先,Firestore 数据库结构。我现在将其称为数据库结构。这是一个可能适合您的模板 -
c- Contacts
d- +1 9999999999 //ABC's Phone No.
f- +1 0000000000 : XYZ's Number // XYZ's Saved Name in ABC's Contacts and his phone no.
f- +1 1111111111 : LMN's Number // LMN's Saved Name in ABC's Contacts and his phone no.
d- +1 0000000000 //XYZ's Phone No.
f- +1 9999999999 : ABC's Number //ABC's Saved Name in XYZ's Contacts and his phone no.
f- +1 1111111111 : LMN's Number // LMN's Saved Name in XYZ's Contacts and his phone no.
其次,这是我认为可用于添加和查询数据库的代码 -
Map<String, Object> contacts = new HashMap<>();
contacts.put("+1 0000000000", "XYZ's Number");
contacts.put("+1 1111111111", "LMN's Number");
db.collection("contacts").document("+1 9999999999")
.set(contacts)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully written!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error writing document", e);
}
});
编辑这部分以获得更有效的查询 -
db.collections("contacts").document("+1 9999999999").get(EditTextEnteredNumber)
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot snap : queryDocumentSnapshots) {
Log.d(TAG, snap.getId() + " => " + snap.getData());
TextViewContactName.setText(snap.getData());
}
}
});
希望对您有所帮助!!
来源
官方 Cloud Firestore 文档 - https://firebase.google.com/docs/firestore/?utm_source=studio
SO 文章 -