2014-09-29 79 views
0

我想添加一个过滤器来检查用户可能输入的重复值。我不确定我的查询中哪里出错。筛选重复值。

我的查询不进入循环检查名称是否已经存在。

我对google-could很新。如果有人能告诉我如何解决我的问题或者是否有更好的解决方案。

else if (commandEls[0].equals("add_director")) { 
     String name = commandEls[1]; 
     String gender = commandEls[2]; 
     String date_of_birth = commandEls[3]; 


     boolean duplicate = false; 
     //add a director record with the given fields to the datastore, don't forget to check for duplicates 

     Entity addDirectorEntity = new Entity("Director"); 

     // check if the entity already exits 
     // if !duplicate add, else "Already exisits" 

     Query directorExists = new Query("Movies"); 

     // Director Name is the primary key 
     directorExists.addFilter("directorName",Query.FilterOperator.EQUAL, name); 
     System.out.print(name); 
     PreparedQuery preparedDirectorQuery = datastore.prepare(directorExists); 

     System.out.print("outside");  
     for(Entity directorResult : preparedDirectorQuery.asIterable()){ 
      // result already exists in the database 
      String dName = (String) directorResult.getProperty(name); 
      System.out.print(dName); 
      System.out.print("finish"); 
      duplicate = true; 
     } 

     if(!duplicate){ 
      addDirectorEntity.setProperty("directorName",name); 
      addDirectorEntity.setProperty("directorGender",gender); 
      addDirectorEntity.setProperty("directorDOB",date_of_birth); 

      try{ 
       datastore.put(addDirectorEntity); 
       results = "Command executed successfully!"; 
      } 
      catch(Exception e){ 
       results = "Error"; 
      } 
     } 

     else { 
      results = "Director already exists!"; 
     } 

    } 

回答

0

非祖先查询(像在你的例子)是最终一致,所以他们不能可靠地检测重复的属性值。祖先查询是完全一致的,但它们需要使用实体组来构造数据,这是以写入吞吐量为代价的。

如果您示例中的directorName属性确实是唯一的,那么您的Director实体的use it as the name in the key即可。然后,当你插入一个新的实体时,你可以首先检查它是否已经存在(在一个事务中)。

数据存储中没有通用的内置方法来确保属性值的唯一性。这个相关的feature request包含用于逼近唯一性约束的一些可能的策略的讨论。

我还建议您阅读数据存储中的queriesconsistency

0

这是一个有效的事情,但我想通了我的问题。 我正在为导演制作一个实体,因为这应该是电影。