Appengine实体更新不起作用

时间:2015-12-30 18:36:31

标签: google-app-engine sql-update

我正在为app引擎开发代码。我尝试通过更新作为查询结果返回的同一实体来更新现有行。但它创建了新行而不是更新同一行。以下是代码:

public boolean updateProfile(DbProfile profile) {

Transaction txn = _datastore.beginTransaction();
Entity entity = getProfileEntity(profile.getLoginId());
if (entity != null) {
    entity.setProperty(DbProfile.DbProfilePropertyNames.address, profile.getAddress());
    entity.setProperty(DbProfile.DbProfilePropertyNames.name, profile.getName());
    Key key = _datastore.put(entity);
    txn.commit();
    return true;
}
return false;
}

private Entity getProfileEntity(String userName) {

Key eRecommendationKey = KeyFactory.createKey("eRecommendation", _dbKeyName);
FilterPredicate predicateUsername =
    new FilterPredicate(DbProfile.DbProfilePropertyNames.loginId, FilterOperator.EQUAL,
                userName.toUpperCase());
Query query =
    new Query(DbProfile.entityProfileName, eRecommendationKey).setFilter(predicateUsername);
List<Entity> profiles =
        _datastore.prepare(query).asList(FetchOptions.Builder.withDefaults());
Utils.log.log( Level.SEVERE, "not found"+profiles.size() );
if (profiles.size() == 0) {
    //profile data is not set yet
    return null;
} else {
    return profiles.get(0);
}
}

下图显示了实体中的字段。 enter image description here

请告诉我如何解决问题。

2 个答案:

答案 0 :(得分:0)

我的Java技能不太好,所以我发现很难理解你的代码示例。我也没有看到调用updateProfile()的位置以及代码如何获取或构建配置文件对象,尤其是配置文件对象的键是否被更改。

但一般来说,如果创建新实体而不是更新现有实体,原因是更新提交时的密​​钥与现有实体的实际密钥不同。

典型情况:

  • 使用字符串(键名)而不是整数(ID),反之亦然
  • 密钥类型名称中的拼写错误
  • 密钥的不同命名空间或应用属性
  • 父母在关键路径中缺失或构造错误

建议:

在数据存储区查看器中,将现有实体的密钥与意外创建的实体的密钥进行比较。两个键之间的区别可能会提示您在代码中查找错误。

答案 1 :(得分:0)

我解决了这个问题。这是我的错。我调用了saveData servlet而不是updateProfile servlet。

相关问题