向Firebase数据库添加其他数据

时间:2018-09-20 07:11:51

标签: javascript firebase web firebase-realtime-database

在我的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

enter image description here

但是问题是,如果我用相同的用户创建另一个教室,它将只更新TheClass [classname]而不创建另一个教室。

enter image description here

我的代码有什么问题?我想念什么?

2 个答案:

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

这里有一些方便的指针。

  1. 所有键都是唯一的。您不能有两个具有相同键的索引。话虽如此,您正在将密钥分配为user.uid,它将始终是相同的。本质上,您正在更新密钥上的值。

  2. 在这里,我假设您要基于使用数据库的用户的uid来创建密钥。因此,使用set仅会存储您的数据,这意味着,如果您给它提供一个新的uid,它将清除您的Classes键中的数据,并使用新的user.uid进行设置您提供的密钥。如果要附加新密钥,则需要使用方法update而不是set方法。它将使用新的Classes键更新user.uid键,这意味着您将向您的Classes对象添加数据。 -fbclass.child(newUserID).update(myClasses);

希望它会有所帮助:))