【问题标题】:Getting GAE Entity by Key通过密钥获取 GAE 实体
【发布时间】:2011-02-23 20:12:28
【问题描述】:

我一直在尝试通过其密钥从 GAE 数据存储中获取实体,该密钥类型为 Key。这是我用来检索密钥的代码:

strId = myVideo.getKey().toString();

myVideo 的类型是实体。 myVideo.getKey().toString() 方法返回的值是“Video(121)”。下面是尝试通过实体键检索实体的代码:

Entity video = ds.get(key);

尝试从数据存储区检索实体时引发以下异常:

没有找到与键匹配的实体: 视频(“视频(121)”)

有没有办法从实体类型的对象中获取编码的密钥?

【问题讨论】:

  • 您是否尝试过查看 GAE 控制面板? appengine.google.com
  • 检查实体是否确实存在于数据存储中?是的,我已验证该实体确实存在于数据存储中。

标签: java google-app-engine google-cloud-datastore


【解决方案1】:

在 App Engine 文档here 中记录了在键和字符串之间进行转换的各种方法。简而言之,要获取密钥的字符串版本,您需要这样做:

String employeeKeyStr = KeyFactory.keyToString(employeeKey);

要将其转换回您可以使用ds.get() 获取的密钥,您应该这样做:

Key employeeKey = KeyFactory.stringToKey(employeeKeyStr);

您使用 .toString() 获取的字符串版本是密钥的人类可读版本,不打算作为机器可读标识符传递。

当然,如果您打算在代码中传递密钥,则根本不需要将它们转换为字符串。相反,如果您想将它们用作外部标识符,您可能需要阅读链接部分的其余部分,其中讨论了祖先、ID 和名称;大多数情况下,当您想要传递标识符时,仅使用名称或 ID 就足够了,并且比完整密钥更短且更易读。

【讨论】:

  • 我需要将键转换为字符串的原因是因为我通过 ajax json 调用将键的值传递给表示层。
【解决方案2】:

我发现在KeyFactory.createKey(Video.class.getSimpleName(), Integer.parseInt(videoID)); 中传入一个字符串类型是导致问题的原因。如果您使用 Key 类型的键,则该键需要由整数组成,因此数据类型转换为:Integer.parseInt(videoID)

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多