我在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()
来存储我有重复数据的节点,如图所示。
有没有办法避免存储重复数据?知道我没有自己的身份证来存储。
任何帮助?
答案 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) {
}
});