2011-11-30 33 views
0

我的應用程序出現了一個非常奇怪的問題,我不知道它爲什麼會發生(僅在模擬器中)。我正在使用自定義的數據庫輔助類,我沒有任何問題。但是我真的經常使用數據庫表中特定列的問題。因此,根據我從父級活動發送的一些extras,我正在運行不同的sql語句。下面是我使用的是什麼:列'objectId'不存在異常(僅在模擬器中)

String sql = ""; 
    switch (sort) { 
    case 1: 
      if (extra != 0) { 
       sql = "SELECT DISTINCT c.objectId FROM cards AS c " 
         + "INNER JOIN cardtags AS ct " 
         + "ON (c.objectId=ct.cardId) " 
         + "WHERE c.collectionId=" 
         + collId 
         + " AND c.repeatsCount>0"+ " AND ct.tagId=" 
         + extra; 

      } else if (extra == 0) { 
       sql = "SELECT DISTINCT c.objectId FROM cards AS c " 
         + "INNER JOIN cardtags AS ct " 
         + "ON (c.objectId=ct.cardId) " 
         + "WHERE c.collectionId=" 
         + collId 
         + " AND c.repeatsCount>0"; 
      } 
     break; 
    case 2: 
      if (extra != 0) { 
       sql = "SELECT DISTINCT cd.objectId FROM cards AS cd " 
         + "INNER JOIN categories AS ct " 
         + "ON (cd.categoryId=ct.objectId) " 
         + "WHERE cd.collectionId=" 
         + collId 
         + " AND ct.objectId=" 
         + extra 
         + " AND cd.repeatsCount>0"; 

      } else if (extra == 0) { 
       sql = "SELECT DISTINCT cd.objectId FROM cards AS cd " 
         + "INNER JOIN categories AS ct " 
         + "ON (cd.categoryId=ct.objectId) " 
         + "WHERE cd.collectionId=" 
         + collId 
         + " AND cd.repeatsCount>0"; 
      } 
     break; 
    case 3: 
      String AscDesc = ""; 
      if (ascDesc == 0) { 
       AscDesc = "ASC"; 
       sql = "SELECT DISTINCT objectId FROM cards " 
         + "WHERE collectionId=" 
         + collId 
         + " AND repeatsCount>0" 
         + " ORDER BY dateCreated " 
         + AscDesc; 

      } else if (ascDesc != 0) { 
       AscDesc = "DESC"; 
       sql = "SELECT DISTINCT objectId FROM cards " 
         + "WHERE collectionId=" 
         + collId 
         + " AND repeatsCount>0" 
         + " ORDER BY dateCreated " 
         + AscDesc; 
      } 
     break; 
    } 
    Cursor myCursor = userDbHelper.executeSQLQuery(sql); 
    if (myCursor.getCount() == 0) { 
     myCursor.close(); 
    } else if (myCursor.getCount() > 0) { 
     myCardID = new ArrayList<Integer>(); 
     myCardID.clear(); 
     for (myCursor.move(0); myCursor.moveToNext(); myCursor.isAfterLast()) { 
      int cardId1 = myCursor.getInt(myCursor.getColumnIndexOrThrow("objectId")); 
      myCardID.add(cardId1); 
     } 
    } 

當我嘗試啓動這個活動它拋出我的異常(僅在模擬器,在真實的設備 - 的HTC Desire,HTC EVO 3D是沒有問題的)

"11-30 14:51:18.899: E/AndroidRuntime(14818): Caused by: java.lang.IllegalArgumentException: column 'objectId' does not exist"

在線:int cardId1 = myCursor.getInt(myCursor.getColumnIndexOrThrow("objectId"));

但奇怪的事情是,當我從仿真器下載數據庫文件並打開它,我可以清楚地看到,我有柱objectId那裏,我使用該列在其他文件也是,但它並沒有拋出我的例外。所以我想知道它是一種模擬器錯誤,因爲我沒有在設備上得到這樣的東西,或者我做錯了什麼。

任何想法?

+0

您是否嘗試過重新創建/升級數據庫? –

+0

我在每個應用程序開始創建數據庫,當我看着sqlite文件時,我可以看到有'objectId'列。 –

+0

您是否嘗試過枚舉列名以查看實際獲得的光標?在某些情況下,objectId可能被稱爲'c.objectId'? – njzk2

回答

1

問題是select語句中列的別名。只有在第三種情況下,你的光標實際上包含一個名爲objectId的列,所以當你做myCursor.getColumnIndexOrThrow("objectId")時它會拋出一個異常。

在情況1中,光標中的列是「c」,情況2中是「卡」。

相關問題