我正在构建一个Android应用程序并使用firebase来存储数据。我的应用程序有课程"课程"和"测验"。我想在用户添加新测验时增加课程对象中quizCount的值。 这是它们存储在firebase中的方式。
这是我写入数据库的代码部分。
toIncrementQuizCount = FirebaseDatabase.getInstance().getReference().child(Constants.FIREBASE_COURSES).child(userId).child(courseKey);
toIncrementQuizCount.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Course course = dataSnapshot.getValue(Course.class);
if(course != null) {
// int quizCount is intially set to 0
quizCount = course.getQuizCount();
// Toast 1
Toast.makeText(getActivity(), "inside listener " + Integer.toString(quizCount), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Quiz quiz = new Quiz(quizTitle, scheduledDate,marksPerQs, 0);
mDatabase.child(Constants.FIREBASE_QUIZZES).child(courseKey).push().setValue(quiz);
// Toast 2
Toast.makeText(getActivity(), Integer.toString(quizCount), Toast.LENGTH_SHORT).show();
quizCount = quizCount + 1;
// Toast 3
Toast.makeText(getActivity(),"after increment " + Integer.toString(quizCount), Toast.LENGTH_SHORT).show();
mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(quizCount);
现在的问题是测验成功存储在数据库中,但是quizCount的值没有增加。 添加测验后立即出现Toast 2和Toast 3,并且在Firebase中通过最后一行代码更新quizCount后(由于quizCount变量最初为0,然后在增量后为1,因此总是更新为1)然后出现Toast 1.这表示ValueEventListener( )在数据库中更改数据时调用。我不想要这个。我想从数据库读取值来增加它。 我也尝试过AddListenerForSingleValueEvent(),但Toast 1根本没有出现。 请告诉我如何读取quizCount的值,以便我增加它并在数据库中更新它。 非常感谢
答案 0 :(得分:0)
我不知道这是不是正确的方法,但我一直在努力。我仍然在寻找一种更好的方法,但是为寻找快速解决方案的人发布我的答案。 这是我在数据库中增加值所做的。我最初放了
count = course.getQuizCount();
count++;
mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(count);
在我的ValueEventListener()中,但是在quizCount中带来了一个显着的增量,值超过了百。 现在我声明了一个布尔变量isIncremented,rest在代码中解释。
// this method is called when user clicks on "add" button to add quiz
public void addQuiz() {
isIncremented = false;
final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
// some irrelevant code here
else{
toIncrementQuizCount.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Course course = dataSnapshot.getValue(Course.class);
if(course != null && isIncremented == false) {
count = course.getQuizCount();
count++;
mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(count);
isIncremented = true;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Quiz quiz = new Quiz(quizTitle, scheduledDate,marksPerQs, 0);
mDatabase.child(Constants.FIREBASE_QUIZZES).child(courseKey).push().setValue(quiz);
Toast.makeText(getActivity(), Integer.toString(count), Toast.LENGTH_SHORT).show();
count = count + 1;
Toast.makeText(getActivity(),"after increment " + Integer.toString(count), Toast.LENGTH_SHORT).show();
mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(count);
}
}
这对我有用。