繁体   English   中英

Appengine实体更新不起作用

[英]Appengine entity update not working

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

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);
}
}

下图显示了实体中的字段。 在此处输入图片说明

请让我知道如何解决此问题。

我的Java技能不是很好,所以我很难理解您的代码示例。 我也看不到在哪里调用updateProfile()以及代码如何获取或构造配置文件对象,尤其是是否更改了配置文件对象的键。

但是通常,如果创建新实体而不是更新现有实体,则原因是更新提交时的密​​钥不同于现有实体的实际密钥。

典型情况:

  • 使用字符串(键名)代替整数(ID),反之亦然
  • 密钥种类名称中的错字
  • 键的不同名称空间或应用程序属性
  • 父母在关键道路上失踪或构造错误

建议:

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

我解决了问题。 是我的错 我曾叫saveData servlet而不是updateProfile servlet。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM