2014-09-26 42 views
0

我正在为每个我输入的添加命令创建一个实体,但我想知道如何检查数据存储区中的重复项?检查在gae数据存储区中是否有重复

Entity entity = new Entity("Animal"); 
    entity.setProperty("nameOfAnimal",name_of_animal); 

我要检查是,如果第二次有其中输入名称相同的动物,我如何检查是否有重复的条目?

回答

0

您可以尝试通过过滤“nameOfAnimal”属性并检查返回的结果来获取实体。如果结果为空,则意味着没有实体。

Filter propertyFilter = 
    new FilterPredicate("nameOfAnimal", FilterOperator.EQUAL, name_of_animal); 
Query q = new Query("Animal").setFilter(propertyFilter); 
PreparedQuery pq = datastore.prepare(q); 
List<Animal> resultList = pq.asList(FetchOptions.Builder.withLimit(1)); 
if(resultList.size() > 0) { 
    // same name exists 
} else { 
    // first entitiy with this name 
} 

该代码未经测试,但这是主要想法。 Here is the documentation for property filters

0

您可以使用动物的名称作为实体的“id”,然后使用get by id来检查该动物名称是否存在。

1

根据您要查找的行为,您有多个选项。

如果您使用nameOfAnimal为实体的名称,你可以简单地尝试通过密钥导入实体创建一个新的人之前:如果你不使用nameOfAnimal为重点

Key animalKey = KeyFactory.createKey("Animal", "fox"); 
Entity fox; 
try { 
    fox = datastoreService.get(animalKey); 
    // no exception thrown so fox already exists 
    throw new RuntimeException("Animal already exists!"); 
} 
catch(EntityNotFoundException e) { 
    // no duplicates, so can create 
    fox = new Entity(animalKey); 
    fox.setNoise("unknown"); 
    datastoreService.put(fox); 
} 

,你可以使用Query("Animal")而不是get()(如在来自eluleci的回答中)。

无论哪种方式,请注意那里有潜在的竞争条件。如果你想使它安全,你需要将它包装在一个transaction,否则你可能会发现两个线程竞争创建第一个狐狸(例如),一个潜在覆盖另一个。

相关问题