Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GAE将信息写入数据存储导致重复写入_Android_Google App Engine - Fatal编程技术网

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

Android GAE将信息写入数据存储导致重复写入,android,google-app-engine,Android,Google App Engine,我有一个每个周末都有测验的应用程序。基本上,我使用GCM向我的用户发送问题,他们可以通过在应用程序中选择正确的答案选项进行回复。这些答案然后以实体的形式存储在数据存储中 我有一个功能,可以在数据存储中写入电话号码并回答正确/不正确的问题- public static void SaveQuizAnswers(String phoneNumberSave, String Answer){ Transaction txn = datastore.beginTransaction();

我有一个每个周末都有测验的应用程序。基本上,我使用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);

问题是,我可以看到为同一用户编写的多个响应。我尝试过将其设为false,这样AppEngine就可以确保单个请求由一个实例提供服务,但仍然可以看到重复的请求。例如,如果我向多个用户发送了5个问题,那么每个用户的回复不应该超过5个,但事实并非如此,我看到每个用户有7到8个回复。这是什么原因造成的?我已经检查了应用程序,那里的代码很好。上述代码是否需要修改。感谢您的帮助。

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

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

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


注意:作为旁注,在您的示例中使用事务没有任何意义-它没有任何区别。

如果需要在事务中执行put函数,则需要在put方法中传递txn对象。如果我在putxn,entity中使用txn,那么它与其他putentity有何不同。Doc说在提供的事务中执行,但我不确定。这会阻止重复写入吗?您还可以根据电话和测验+问题编号自己构建实体密钥。这样就不需要DUP,也不需要子实体slower@ZigMandel:您是对的,但子实体并不慢。事实上,祖先查询通常更快。是的,它们是ro commit。您可以每秒提交1个问题。为了详细说明问题,如果我向用户发送5个问题,然后在他们答复时,我希望以不覆盖实体的形式分别保存所有5个答复。代码也做了同样的事情,并且运行良好,除了一些情况,我可以看到为一些用户编写了超过5个实体。我不确定这是什么原因造成的。此外,用户对每个问题只能回答一次,因此每个用户的回答不应超过5个。我们建议的解决方案将保存5个单独的回答,但它们将防止同一学生对同一问题的重复回答。如何确保您只能回复一次?他们可以点击后退按钮、双击提交按钮等吗。?是否可能将多个处理程序附加到按钮?您的回复是否可能无法送达客户,因此客户认为需要再次提交?