2012-09-05 85 views
0

我在數據存儲中存在實體。我可以通過屬性查詢如發現管理控制檯:Appengine數據存儲無法通過未編碼密鑰找到現有實體

SELECT * FROM UserEntry where email = '[email protected]' 

並且還通過編碼的鑰匙串進行查詢,如:

SELECT * FROM UserEntry where __key__ = KEY('cy1hcHByIAsSCVVzZXJFbnRyeM') 

然而,當我查詢的未編碼的關鍵實體,它不是發現:

SELECT * where __key__ = KEY('UserEntry','[email protected]') 

從以前的查詢中,我可以驗證該鍵是否正確,並且相同的查詢適用於相同類型的其他實體。

我遇到相同的行爲,當我嘗試通過JDO API來訪問實體:

pm.getObjectById(UserEntry.class, "[email protected]"); 

該代碼產生以下異常:

javax.jdo.JDOObjectNotFoundException: Could not retrieve entity of kind UserEntry with key UserEntry("[email protected]") 

這是怎麼回事?我怎樣才能解決這個問題,並在將來避免它?

+0

如果您發佈* actual *值而不是'cy1hcHByIAsSCVVzZXJFbnRyeM'和「[email protected]」,這將有所幫助。然後我可以很容易地檢查這些是否相同。你給的不是; 'cy ... eM'甚至不是一個有效的密鑰。 –

+0

實際值是我們用戶的電子郵件地址,這是一種私人信息..但我可以向您保證編碼密鑰的名稱正確解碼給定的電子郵件。 –

+0

所以你說只有一個關鍵字和一個關鍵字,使用KEY進行查詢('sdfasdfasdfasfsdfasdfsd'),但使用KEY('classname','keyname')的相同查詢失敗?始終如一?你不能用其他鍵重現?那麼請私下向我發送詳細信息。 –

回答

2

離線時,我們發現urlsafe密鑰字符串會對用戶名添加空格進行編碼,就像編碼爲KEY('UserEntry','[email protected] ')一樣。這似乎是程序中的輸入驗證錯誤。

+0

感謝您指認,Guido。愚蠢的我忽略了這一點。 –

0

電子郵件屬性是您在實體上的PK嗎?因爲如果不是,查詢它沒有意義。一旦您將第一個查詢與電子郵件一起作爲普通屬性發布,我認爲它不會在您的PK上重複,因此您無法在Key(類型,電子郵件)上使用它進行查詢。

在管理控制檯上獲取實體後,單擊key屬性以確保電子郵件是密鑰的一部分。

+0

「email」屬性不是實體上的PK。該電子郵件地址既在PK和「電子郵件」屬性 - 它重複,因爲屬性「電子郵件」用作聯繫地址,用戶可以更改它。 在管理控制檯的實體詳細信息中,它會顯示「解碼實體密鑰:UserEntry:[email protected]」 –

相關問題