2013-05-13 47 views
0

我在我的android應用程序中使用sqlite來存儲數據。 每當我啓動應用程序,我從服務器獲取一些數據並將其存儲在客戶端。現有數據更新和新數據插入到數據庫中。SQLite返回一個空的遊標,即使數據存在

但是在許多情況下,我通過查詢 "select * from Table where itemId = x"從DB訪問現有項目時從DB獲得空白光標。就像我在更新它之前從設備/模擬器中提取數據庫一樣,我可以看到數據存在於數據庫中。

只有當我從服務器獲取大量數據並與現有數據進行比較時,纔會出現此問題。 比較是在一個循環中完成的,每次我得到一個遊標並關閉它,然後再進行下一個比較。

try{ 
int[] ids = getIds(); // get required ids 
for(i =0; i<ids.length, i++) 
{ 
// 
Cursor c = db.rawQuery("Select * from Table where id = "+ids[i]); 
if(c == null || (c != null && c.getcount() == 0)) 
{ 
// new data 
}else if(c.getcount()>0) 
{ 
// existing data 
} 
} 
}catch(Exception e){ 
    e.printStackTrace(); 
}finally{ 
if(c!=null && !c.isClosed()) 
{ 
c.close() 
} 
c = null; 
} 

我注意到,第一次我得到一個遊標的數​​據,但之後,我得到空白光標。

+3

您需要額外郵費優惠後,才能獲得此頁面的幫助。 – 2013-05-13 06:13:34

+0

刪除'catch'以獲取錯誤消息。 – 2013-05-13 12:01:58

+0

沒有例外,我正在創建一個空的遊標。 – Atmaram 2013-05-13 12:52:36

回答

0

問題已解決。

很抱歉,問題與查詢無關,但是輸入參數(id)。在某些情況下,id是錯誤的,因此它返回空白光標。

1

查詢之後,如果光標包含超過零行,以下部分:

{ 
// existing data 
} 

將被執行的「尺寸」倍。 如果光標爲空或不包含任何行,你的部分:

{ 
// new data 
} 

將執行「大小」時代。

這是因爲您的查詢是靜態的。對於循環中的每個迭代,您正在製作相同的查詢。 如果這是你想要的,你應該打電話給rawQuery方法以外的循環。

此外:

if(c == null || c != null && c.getcount() == 0) 

相當於:

if(c == null || c.getCount() == 0) 

的如果在線路條件:可以省略

else if(c.getcount()>0) 

+0

感謝您的回覆。我不執行相同的查詢大小時間,而是x值僅供參考,我應該使用「i」代替。在每個循環中考慮使用不同參數的相同查詢。 – Atmaram 2013-05-13 14:26:30

+0

也許,當您對i == 1進行查詢時,找不到結果。 – GVillani82 2013-05-13 14:30:19

+0

我剛剛更新了代碼塊,請看看。 – Atmaram 2013-05-13 14:32:25

相關問題