我正在使用此代码在Android上向Firebase添加新项目。但是,如果有人试图使用相同的键添加另一个项目,它将替换当前项目!我怎样才能防止这种情况发生?我的意思是像常规数据库;我想使用密钥作为我的主键,不允许添加任何具有相同密钥的项目(或替换另一个现有项目)
myFirebaseRef.child(key).setValue(item, new Firebase.CompletionListener()
{
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase)
{
}
});
我不想使用push(),因为键在我的应用中有意义,我想保持唯一性
答案 0 :(得分:1)
使用runTransaction
这是一个原子操作,以确保没有覆盖键。您可以参考this answer了解如何使用runTransaction
。以下是答案示例
firebaseRef.child("uniquekeys").child(uniqueKey).runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
if (mutableData.getValue() == null) {
mutableData.setValue(value);
return Transaction.success(mutableData);
}
return Transaction.abort();
}
@Override
public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) {
if (commited) {
// unique key saved
} else {
// unique key already exists
}
}
});
答案 1 :(得分:1)
试试吧。
myFirebaseRef.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() == null) {
//does not exists
} else {
//exists
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 2 :(得分:0)
我认为,您可以通过定义自己来使用主键,或者在通过方法添加值之前检查存在键:
Firebase fb = myFirebaseRef.child(key);
if(fb == null){
//it means the child is not exist
}
else{
//it means the child is existing
}