在我的Web应用程序中,我想创建一个教室并将数据添加到我的Firebase数据库中。
var fbclass = firebase.database().ref().child('Classes');
function classcreation(q) {
var usuid = generateId();
var myClasses={};
myClasses.TheClass = document.getElementById('classroomName').value;
myClasses.Teacher = user.displayName;
myClasses.TeacherEmail = user.email;
myClasses.ClassID = usuid;
fbclass.child(user.uid).set(myClasses);
}
function generateId(){
return 'xxxx-xxxx-xxxx'.replace(/[x]/g, function(){
return (Math.random() * 9 | 0 ).toString();
})
}
提交按钮后,它将数据存储到Firebase
但是问题是,如果我用相同的用户创建另一个教室,它将只更新TheClass [classname]而不创建另一个教室。
我的代码有什么问题?我想念什么?
答案 0 :(得分:1)
通过使用set()
方法,您正在fbclass.child(user.uid)
位置(即参考)写入数据,请参见doc。
由于您的位置基于user.uid
,因此您一次又一次使用给定用户的同一位置:因此,您遇到的覆盖(由于set()
“会覆盖此位置的所有数据和所有子对象位置”)。
每次为同一用户编写一个新教室时,您都应该生成一个唯一密钥。为此,您应该使用push()
方法(doc),该方法“使用唯一键生成新的子位置”,如下所示:
var newClassroomRef = fbclass.child(user.uid).push(
{
'Class_Id': '....',
'Teacher': '....'
}
);
以下内容也可以工作:
var newClassroomRef = fbclass.child(user.uid).push();
newClassroomRef.set({
'Class_Id': '....',
'Teacher': '....'
});
请注意,这将在您的节点树中user.uid
节点下创建一个额外的级别;
- Classes
- yo9HQ....... <- user.uid
- 6trQEd....... <- classroom uid
- Teacher: .....
- .....: .....
- PKH6fd....... <- classroom uid
- Teacher: .....
- .....: .....
答案 1 :(得分:0)
这里有一些方便的指针。
所有键都是唯一的。您不能有两个具有相同键的索引。话虽如此,您正在将密钥分配为user.uid
,它将始终是相同的。本质上,您正在更新密钥上的值。
在这里,我假设您要基于使用数据库的用户的uid来创建密钥。因此,使用set
仅会存储您的数据,这意味着,如果您给它提供一个新的uid,它将清除您的Classes
键中的数据,并使用新的user.uid
进行设置您提供的密钥。如果要附加新密钥,则需要使用方法update
而不是set方法。它将使用新的Classes
键更新user.uid
键,这意味着您将向您的Classes
对象添加数据。
-fbclass.child(newUserID).update(myClasses);
希望它会有所帮助:))