2016-04-25 79 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

这更搞笑:)以同样的方式 –