我正在写一个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不同的密钥类型。 –