2016-04-25 107 views
2

我正在寫一個android應用程序,我想檢查一個鍵是否存在以避免重複的值。我一直在調查,但看起來我可以添加的是偵聽器,當我只想檢查一個ID是否存在。檢查Firebase中是否存在ID [Java]

以此SO question爲例,我想知道是否存在-JlvccKbEAyoLL9dc9_v

我該怎麼做?

在此先感謝。

回答

11

的方法將總是相似,我在這個答案寫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時,它們在統計上保證是唯一的。所以他們中的任何一個都不可能創建出與另一個相同的密鑰。

,你需要檢查的項目已經存在很可能有競爭條件任何情況下:如果兩個客戶端在同一時間幾乎執行此檢查,他們都沒有找到一個值。

+0

非常感謝,它的工作完美,但我關心你對比賽條件的建議。推送ID是什麼意思?我不應該做這種檢查嗎?有沒有其他方法可以避免重複的ID? –

+0

我擴大了我的答案,更清楚地覆蓋推ID的情況下,VS不同的密鑰類型。 –

0

基於@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以編程方式創建模式。我使用它來添加新數據而不覆蓋現有數據。

1

RxJava 2:

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); 
+0

有趣,我已經mplemented這個方法你做 –

+0

@MohamedIbrahim :)偉大雅哈比比:) – MBH

+0

這更搞笑:)以同樣的方式 –