2013-12-11 100 views
0

我已經將一個sqlite數據庫放入我的資產文件夾並將其導入到手機中。導入的sqlite數據庫缺少數據和混合列

我創建具有多個屬性的對象,當我創建的對象的列表,並從他們弄混

下表中的列分配給每個屬性的值是我的代碼

public ArrayList<Exercise> getExercisesFromQuery(String Query) { 
    ArrayList<Exercise> ExerciseList = new ArrayList<Exercise>(); 

    Cursor cursor = mDb.rawQuery(Query, null); 
    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Exercise e = new Exercise(); 
      e.setID(Integer.parseInt(cursor.getString(0))); 
      e.setName(cursor.getString(1)); 
      e.setMuscle(cursor.getString(2)); 
      e.setDescription(cursor.getString(3)); 
      e.setFilepath(cursor.getString(4)); 
      e.setSets(cursor.getString(5)); 
      e.setReps(cursor.getString(6)); 
      e.setEquipment(cursor.getString(7)); 
      e.setPrimaryMuscle(cursor.getString(8)); 
      e.setSecondaryMuscle(cursor.getString(9)); 
      e.setDifficulty(cursor.getString(10)); 
      // Adding contact to list 
      ExerciseList.add(e); 
     } while (cursor.moveToNext()); 
    } 
    return ExerciseList; 
} 

目前的問題是當我做object.getName它給了我肌肉,如果我做object.getmuscle它是空白的,沒有價值,但如果我做object.getDescription它工作正常。

這不是數據庫的問題,它可以在任何sqlite管理器中正常工作。

關於什麼是錯誤的任何想法?

回答

1

確保數據庫中的列的順序正確 - 列Name應該是第二列,列Muscle應該是第三列。

+0

他們是,但它仍然不能解釋爲什麼肌肉列完全是空白的 –

+0

你應該在你的'do'循環的開頭添加一個斷點,看看'cursor.getString(...)'返回的值是什麼給你一個想法。 –

2

不按照您期望的順序返回列的原因尚不清楚。它們應該按照查詢中指定的順序或按照它們在表上的順序返回,如果您正在執行SELECT *。然而,解決這個具體難題並不是必須的。

更具防禦性和可維護性的編碼方法是通過使用getColumnIndexOrThrow方法請求遊標中的每個列的索引,而不是對它們進行硬編碼。例如:

int ID_INDEX = cursor.getColumnIndexOrThrow("_id"); 
int NAME_INDEX = cursor.getColumnIndexOrThrow("name"); 

如果該列不存在,您將得到一個異常。如果是的話,你現在有它的光標內的索引,你可以在電話使用cursor.getString:

e.setID(Integer.parseInt(cursor.getString(ID_INDEX))); 
e.setName(cursor.getString(NAME_INDEX)); 

使您不再需要擔心什麼順序列回來和你贏了」如果您的查詢在將來發生變化,則需要更改任何硬編碼的索引值。