我有一个应用程序,每个周末举行一个测验。基本上我使用GCM向用户发送问题,他们可以通过在应用程序中选择正确的答案选项进行回复。然后,这些答案以实体的形式存储在数据存储区中。
我有一个功能来写电话号码并回答(正确/不正确)到数据存储区 -
public static void SaveQuizAnswers(String phoneNumberSave, String Answer){
Transaction txn = datastore.beginTransaction();
try {
Entity entity = new Entity(QUIZ);
entity.setProperty(PHONE_NO, phoneNumberSave);
entity.setProperty(ANSWER, Answer);
datastore.put(entity);
txn.commit();
} finally {
if (txn.isActive()) {
txn.rollback();
}
}
}
此功能由以下代码调用 -
String Answer = req.getParameter("Answer");
String phoneNumberSave = req.getParameter("phoneNumber");
Datastore.SaveQuizAnswers(phoneNumberSave, Answer);
问题是我可以看到为同一个用户编写的多个响应。我尝试制作<threadsafe>false</threadsafe>
,以便App引擎确保实例提供单个请求,但我仍然看到重复。因此,例如,如果我向多个用户发送了5个问题,那么对于每个用户,响应不应超过5个,但事实并非如此,我看到每个用户有7个或8个响应。是什么造成的?我检查了应用程序,代码很好。上述代码是否需要进行任何修改。感谢您的帮助。
答案 0 :(得分:0)
每次使用自动生成的标识符创建新实体。如果同一用户多次提交响应,您将看到多个实体。
阻止它的唯一方法是检查此响应是否已存在,并覆盖它。
另一种选择是使响应实体成为测验实体的子实体,并使用电话号码作为每个响应实体的名称。然后你不必进行任何检查 - 你可以用电话号码作为标识符来构建一个新实体,如果这个实体已经存在,它将被覆盖。
注意:作为旁注,在你的例子中使用交易毫无意义 - 它没有任何区别。