如果密钥存在,如何阻止向Firebase添加数据

时间:2016-04-06 05:52:19

标签: android firebase firebase-security

我正在使用此代码在Android上向Firebase添加新项目。但是,如果有人试图使用相同的键添加另一个项目,它将替换当前项目!我怎样才能防止这种情况发生?我的意思是像常规数据库;我想使用密钥作为我的主键,不允许添加任何具有相同密钥的项目(或替换另一个现有项目)

myFirebaseRef.child(key).setValue(item, new Firebase.CompletionListener() 
{
    @Override
    public void onComplete(FirebaseError firebaseError, Firebase firebase)
    {

    }
});

我不想使用push(),因为键在我的应用中有意义,我想保持唯一性

3 个答案:

答案 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
}