是否有可能避免Firebase数据库中的冗余?
我有一个应用程序,用户可以在其中添加第一个单词和第二个单词。使用按钮,您可以获取两个单词中的一个随机单词。
Random rand = new Random();
int n = rand.nextInt(9);
Random rand1 = new Random();
int m = rand1.nextInt(8);
String first = sp.getItemAtPosition(n).toString();
String second = sp2.getItemAtPosition(m).toString();
out.setText(first + second);
所以我从微调框(Spinner)中得到了文字(请不要问为什么这样做)
现在好。如何检查随机选择的单词是否已在数据库中?
使用if-else指令吗?
结构如下:
{"1stWord" : {
"1stWord" : {
"-LI125GLPy0-IPAm4GEM" : {
"name" : "test"
},
先谢谢大家!
答案 0 :(得分:1)
您需要使用查询来检查数据库中是否存在该值:
ref.child("Words").orderByChild("randomWord1").equalTo(second).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
//it exists
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
假设您有此数据库:
Words
randomId
randomWord1: "words"
因此,您在此处使用orderByChild()
检查此子项是否等于随机词。然后,您使用dataSnapshot.exists()
检查要检索的数据是否存在于数据库中。
答案 1 :(得分:1)
Firebase
有其自己的唯一ID作为默认值,我认为这是最好的方法,因为firebase
实际上进行检查和分配,因此可以减少代码数量。所以我建议就这样离开。在文档级别设置唯一ID。
答案 2 :(得分:1)
如果要确保某个值在数据库中是唯一的,则使用该值作为节点内键的最简单方法。因此,如果您的单词要唯一,请创建一个节点words
,并在该节点下将每个单词存储为具有true
伪值的关键字。例如。
"words": {
"avoid": true,
"redundance": true
}
由于键在集合中按定义是唯一的,因此可以自动确保满足您的要求。
要在此集合中写一个新词,您将使用一个事务:
DatabaseReference wordRef = FirebaseDatabase.getInstance().getReference("words/avoid");
wordRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
String word = mutableData.getValue(String.class);
if (word == null) {
mutableData.setValue("avoid");
return Transaction.success(mutableData);
}
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "writeWord completed: " + databaseError);
}
});
另请参阅以下一些答案: