GAE将信息写入数据存储区导致重复写入

时间:2015-04-19 17:34:25

标签: android google-app-engine

我有一个应用程序,每个周末举行一个测验。基本上我使用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个响应。是什么造成的?我检查了应用程序,代码很好。上述代码是否需要进行任何修改。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

每次使用自动生成的标识符创建新实体。如果同一用户多次提交响应,您将看到多个实体。

阻止它的唯一方法是检查此响应是否已存在,并覆盖它。

另一种选择是使响应实体成为测验实体的子实体,并使用电话号码作为每个响应实体的名称。然后你不必进行任何检查 - 你可以用电话号码作为标识符来构建一个新实体,如果这个实体已经存在,它将被覆盖。

注意:作为旁注,在你的例子中使用交易毫无意义 - 它没有任何区别。