我正在寫一個android應用程序,我想檢查一個鍵是否存在以避免重複的值。我一直在調查,但看起來我可以添加的是偵聽器,當我只想檢查一個ID是否存在。檢查Firebase中是否存在ID [Java]
以此SO question爲例,我想知道是否存在-JlvccKbEAyoLL9dc9_v
。
我該怎麼做?
在此先感謝。
我正在寫一個android應用程序,我想檢查一個鍵是否存在以避免重複的值。我一直在調查,但看起來我可以添加的是偵聽器,當我只想檢查一個ID是否存在。檢查Firebase中是否存在ID [Java]
以此SO question爲例,我想知道是否存在-JlvccKbEAyoLL9dc9_v
。
我該怎麼做?
在此先感謝。
的方法將總是相似,我在這個答案寫JavaScript的:Test if a data exist in Firebase
ref.child("-JlvccKbEAyoLL9dc9_v").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
// TODO: handle the case where the data already exists
}
else {
// TODO: handle the case where the data does not yet exist
}
}
@Override
public void onCancelled(FirebaseError firebaseError) { }
});
但是請記住,在推IDS火力地堡的存在,以防止有做這樣的檢查。當多個客戶端生成推送ID時,它們在統計上保證是唯一的。所以他們中的任何一個都不可能創建出與另一個相同的密鑰。
,你需要檢查的項目已經存在很可能有競爭條件任何情況下:如果兩個客戶端在同一時間幾乎執行此檢查,他們都沒有找到一個值。
基於@Frank麪包車Puffelen的答案,這裏的幾行字,看是否有裁判 - 本身 - 使用它之前就存在。
public void saveIfRefIsAbsent(DatabaseReference firebaseRef) {
DatabaseReference parentRef = firebaseRef.getParent();
String refString = firebaseRef.toString();
int lastSlashIndex = refString.lastIndexOf('/');
String refKey = refString.substring(lastSlashIndex + 1);
parentRef.child(refKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
// TODO: handle the case where the data already exists
}
else {
// TODO: handle the case where the data does not yet exist
}
}
@Override
public void onCancelled(FirebaseError firebaseError) { }
});
}
在我的情況下,我有一個Util以編程方式創建模式。我使用它來添加新數據而不覆蓋現有數據。
public static Observable<Boolean> observeExistsSingle(final DatabaseReference ref) {
return Observable.create(emitter ->
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
emitter.onNext(dataSnapshot.exists());
emitter.onComplete();
}
@Override
public void onCancelled(DatabaseError databaseError) {
emitter.onError(databaseError.toException());
}
}));
}
public Observable<Boolean> isYourObjectExists(String uid) {
return observeExistsSingle(databaseReference.child(uid));
}
在你的類:
yourRepo.isYourObjectExists("-JlvccKbEAyoLL9dc9_v")
.subscribe(isExists -> {}, Throwable::printStackTrace);
非常感謝,它的工作完美,但我關心你對比賽條件的建議。推送ID是什麼意思?我不應該做這種檢查嗎?有沒有其他方法可以避免重複的ID? –
我擴大了我的答案,更清楚地覆蓋推ID的情況下,VS不同的密鑰類型。 –