我正在尝试添加过滤器以检查用户可能输入的重复值。我不确定我的查询在哪里出错。
我的查询不会进入循环以检查名称是否已存在。
我对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 :(得分:0)
非祖先查询(如示例中的查询)最终是一致的,因此无法可靠地检测重复的属性值。祖先查询完全一致,但它们需要使用实体组来构建数据,这需要以写入吞吐量为代价。
如果您示例中的directorName
属性确实是唯一的,则可以Director
个Director
个实体。然后,当您插入新的{{1}}实体时,您可以先检查它是否已存在(在事务内)。
数据存储区中没有通用的内置方式来确保属性值的唯一性。这个相关的use it as the name in the key包含了对近似唯一性约束的一些可能策略的讨论。
我还建议您阅读数据存储区中的feature request和queries。
答案 1 :(得分:0)
这是有效的事情,但我想出了我的问题。 我正在制作导演实体,因为那应该是电影。