2011-02-23 95 views
4

我一直在试图通过其密钥类型为Key的GAE数据存储获取实体。以下是我用来检索密钥的代码:通过密钥获取GAE实体

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

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

Entity video = ds.get(key); 

正在尝试从数据存储实体时,以下异常被抛出:

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

有没有办法从一个实体类型的对象获得编码密钥?

+0

你有没有试过在GAE控制面板中看看? http://appengine.google.com – Finbarr 2011-02-23 21:57:33

+0

来检查实体是否存在于数据存储中?是的,我已验证该实体确实存在于数据存储中。 – Tim 2011-02-23 22:09:12

回答

2

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

4

在App Engine文档here中记录了键和字符串之间转换的各种方法。总之,拿到钥匙的字符串版本,要做到这一点:

String employeeKeyStr = KeyFactory.keyToString(employeeKey); 

要将其转换回键,你可以用ds.get()回来,你应该这样做:

Key employeeKey = KeyFactory.stringToKey(employeeKeyStr); 

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

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

+0

我需要将键转换为字符串的原因是因为我通过ajax json调用将键的值传递给表示层。 – Tim 2011-02-24 05:45:59

+0

@Tim你可能想看看只传递身份证或姓名,这是更紧凑和用户友好的,然后,如我在我的答案结束时建议。 – 2011-02-25 02:12:37