2012-02-10 62 views
0

對於iOS項目,我使用GAE(Java堆棧)存儲用戶的設備令牌並使用它發送推送通知。GAE:比較執行JDO查詢時返回錯誤結果的字符串值

我有一個Device實體,它包含幾個字段,包括String類型的「appVersion」字段。該數據庫包含了一些設備與版本1和一些與版本2

當我運行一個JDO查詢找到與「appVersion」所有設備等於2返回預期的結果,但是當我做相同的版本1該查詢不返回任何結果,儘管存在與此條件匹配的實體。

這是代碼:

javax.jdo.Query query = _pm.newQuery(Device.class, "appVersion == appVersionParams"); 

query.declareParameters(String.class.getName()+" appVersionParams"); 

List<Device> results = (List<Device>) query.execute(message.getAppVersion()); 

我驗證了幾次,與第1版設備的實體被正確地存儲(類型爲字符串,其中包含正確的,修剪值,這的確完全匹配的參數我通過)。

我第一次在開發環境中遇到過這個問題,所以我刪除了本地數據庫並創建了測試實體並再次運行查詢 - 這次它返回了版本1和2的預期結果。但是在我重新啓動服務器之後再次返回版本1的錯誤結果(同時使用版本2)。希望這只是本地開發環境中的一個bug。我將它部署到生產環境,它只返回4個實體(有幾千個匹配這個條件) - 所有實體都以相同的方式/ API存儲。

我也嘗試從JDO切換到低級別的API來獲取實體,但我得到了相同的奇怪行爲。這是它的代碼:

Query q = new Query("Device"); 
q.addFilter("appVersion", FilterOperator.EQUAL, message.getAppVersion()); 

我要瘋了這是怎麼回事?

+0

嘗試在查詢中使用'this.appVersion'。 – Viruzzo 2012-02-10 14:31:33

+0

謝謝,我在本地嘗試了它,並將它部署到GAE,但結果相同。當我期待數千人時,我只有少數實體回來了。 – 2012-02-10 15:16:31

+0

你確定你堅持正確嗎?我的意思是,如果你不過濾,那麼你是否按預期得到它們? – Viruzzo 2012-02-10 16:35:39

回答

0

該問題與我對持久實體結構/模式所做的修改沒有正確使用serialVersionUID有關。查看問題的更多細節的評論,特別是Viruzzo的。