如何防止Android版Firebase数据库中的重复数据

时间:2016-09-21 05:35:38

标签: android firebase firebase-realtime-database

我在Firebase for Android中有一个数据库,我有一个对象,其中包含您在图像中看到的属性。使用以下代码将对象存储在数据库中:

FirebaseUser user = mAuth.getCurrentUser();
String videoId = getIntent().getStringExtra("VIDEO_ID");
minuto = player.getCurrentTimeMillis();
Watching  watching  = new Watching(user.getUid(), videoId, String.valueOf(minuto));
DatabaseReference mRef = database.getReference().child("Watching").push();
mRef.setValue(watching);

我遇到的问题是因为我使用push()来存储我有重复数据的节点,如图所示。

enter image description here

有没有办法避免存储重复数据?知道我没有自己的身份证来存储。

任何帮助?

2 个答案:

答案 0 :(得分:2)

这取决于您如何定义副本。

人们有这个问题的常见情况是他们存储用户的时间。复制的定义很简单:如果两个用户对象具有uid的相同值,则它们是同一个用户。因此,在这种情况下,您应该将用户存储在uid下,而不是在推送ID下。

这同样适用于您的情况。如果单个用户只能观看单个视频,请将Watching下的节点存储在用户的uid下:

Watching
    "NX7...A33"
        "idVideo": "b13...o4s"
        "minute": "0"

但如果uid + idVideo的组合是唯一的,请将节点存储在组合键下:

Watching
    "NX7...A33_b13...o4s": "0"

现在,您可以使用setValue()代替push()轻松防止重复:

String key = user.getUid() + "_" + videoId;
ref.child("Watching").child(key).setValue(String.valueOf(minuto));

答案 1 :(得分:0)

我遇到了和你一样的问题,这就是我弄明白的问题。我正在检查用户输入的电子邮件地址,保存在我的db.if中,找到任何匹配项,然后显示toast,电子邮件已经存在,否则用新密钥保存。

mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(final DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                 //If email exists then toast shows else store the data on new key
                    if (!data.getValue(User.class).getEmail().equals(email)) {
                        mFirebaseDatabase.child(mFirebaseDatabase.push().getKey()).setValue(new User(name, email));
                    } else {
                        Toast.makeText(ChatListActivity.this, "E-mail already exists.", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onCancelled(final DatabaseError databaseError) {
            }
        });