我有 Big Data 有近100万条记录甚至更多,第一次查询需要很长时间,而且大部分时间都是这样.
我的规则是:
{
"rules": {
"iBkH2321":{
"$uid":{
".read": "false",
".write": "true"
}
},
"Contacts":{
".indexOn": ["mobile","name","android_id"],
".read":"root.child('iBkH2321').child(auth.uid).val() == true",
".write":"root.child('iBkH2321').child(auth.uid).val() == true",
},
"AppVersion":{
".read": "true",
".write": "false",
".indexOn":["VersionNumber"]
}
}
}
这样的数据:
{
"contacts" : {
"-Moj9LK306LUDCXIbypG" : {
"-Moj9LK5rgNYVcD1PJ2S" : {
"android_id" : "312e62167b076ce1",
"mobile" : "770966855",
"name" : "عبدالله سيلان / فرع اب الشركة"
},
"-Moj9LKEZgZqu8tyW-4c" : {
"android_id" : "312e62167b076ce1",
"mobile" : "711237507",
"name" : "عبد الملك عمر / الهلال للصرافة تعز"
},
"-Moj9LKFmA0E6jJMuWfD" : {
"android_id" : "312e62167b076ce1",
"mobile" : "711290007",
"name" : "احمد هاشم /ايتي عدن للصرافة"
},
.
.
.
"-MopGM8c8Fosxb0WKJpx" : {
.
.
}
.
.
"iBkHop2321" : {
"026Z0V8ad8MnJtnfn9qt6atgMWS2" : true,
"0CDZ0V8aAxMnJtnre9qt6atgZiw2" : true,
.
.
.
.
}
这是我的密码:
private DatabaseReference myRef ;
.
.
.
final FirebaseDatabase database = FirebaseDatabase.getInstance();
myRef = database.getReference("Contacts");
auth = FirebaseAuth.getInstance();
.
.
.
private void TestShearch(String number){
AtomicBoolean getResult = new AtomicBoolean(false);
ArrayList<Contacts> arrayList = new ArrayList<>();
ArrayContacts arrayContacts = new ArrayContacts(context, arrayList);
listView.setAdapter(arrayContacts);
Query query = myRef.orderByChild("mobile").equalTo(number).limitToLast(30);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(isAdded() && activity != null) {
arrayList.clear();
getResult.set(true);
for (DataSnapshot ds : snapshot.getChildren()) {
Contacts con = ds.getValue(Contacts.class);
arrayList.add(con);
assert con != null;
}
arrayContacts.notifyDataSetChanged();
listView.setAdapter(arrayContacts);
} else {
getResult.set(false);
Toast.makeText(context, "لا توجد بيانات لهذا الرقم حالياً", Toast.LENGTH_LONG).show();
}
progressBar.setVisibility(View.GONE);
btn_search.setVisibility(View.VISIBLE);
myRef.removeEventListener(this);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
//do somthing here
}
};
query.addListenerForSingleValueEvent(valueEventListener);
}
注意:我在onStart()中使用身份验证:
@Override
protected void onStart() {
super.onStart();
FirebaseUser currentUser = mAuth.getCurrentUser();
updateUI(currentUser);
}
private void updateUI(FirebaseUser currentUser) {
if(currentUser == null){
mAuth.signInAnonymously().addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
myRef2.child(Objects.requireNonNull(mAuth.getUid())).setValue(true);
Log.d("userAuth11", "signInAnonymously:parent success");
} else{
Log.d("userAuth11", "signInAnonymously:parent failed");
updateUI(null);
}
}
});
}
当我启动应用程序时,查询需要30-60秒以上,之后变得比旧的查询更快!
你能帮帮我吗? 谢谢.
我认为问题出在我查询的数据的大小上,因为数据的大小大约是2 GB?