2013-12-16 51 views
0

我想從tableName中使用SELECT *來獲取Array的列表。但我只是以奇怪的方式獲得最後一排。我以示例向我們展示。我只有兩行數據,我手動輸入。我們假設數據是StackOverFlow和Google分別使用Ids 1和2。我得到的只有Google和Google兩次。這是我的代碼;僅獲得arraylist中的最後一行

投資組合課;

trainingArrayList = new ArrayList<Training>(); 

    //creates and open the database so we can use it 
    DatabaseHelper db = DatabaseHelper.getInstance(); 

    // Getting a cursor to fetch data from the database 
    final Cursor cursor = db.select("SELECT * FROM training"); 

    if (cursor.moveToFirst()) { 

     while (cursor.isAfterLast() == false) { 
      Training training = Training.getInstance(); 
      training.setId(cursor.getInt(cursor 
        .getColumnIndex(DatabaseHelper.TRAINING_ID))); 
      training.setTitle(cursor.getString(cursor 
        .getColumnIndex(DatabaseHelper.TRAINING_TITLE))); 
      training.setDescription(cursor.getString(cursor 
        .getColumnIndex(DatabaseHelper.TRAINING_DESCRIPTION))); 
      training.setDate(cursor.getString(cursor 
        .getColumnIndex(DatabaseHelper.TRAINING_DATE))); 
      training.setLocation(cursor.getString(cursor 
        .getColumnIndex(DatabaseHelper.TRAINING_LOCATION))); 

      this.trainingArrayList.add(training); 
      cursor.moveToNext(); 
     } 
    } 

我的研修班是:

public class Training { 

private static Training instance = null; 

// global variables 
public int id; 
public String title; 
public String description; 
public String date; 
public String location; 
private Trainer trainer; 

private ArrayList<Trainee> traineeArrayList; 

private Training(){ 
    //Restrict the constructor from being instantiated 
} 

public static Training getInstance(){ 
    if(instance == null){ 
     instance = new Training(); 
    } 
    return instance; 

} 

// Constructor 
public Training(int _id, String title, String description, String date, 
     String location) { 

    this.id = _id; 
    this.title = title; 
    this.description = description; 
    this.date = date; 
    this.location = location; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 

} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public String getDate() { 
    return date; 
} 

public void setDate(String date) { 
    this.date = date; 
} 

public String getLocation() { 
    return location; 
} 

public void setLocation(String location) { 
    this.location = location; 

} 

public Trainer getTrainer() { 
    return trainer; 
} 

public Training (Context context) { 

    DatabaseHelper db = DatabaseHelper.getInstance(); 

    traineeArrayList = new ArrayList<Trainee>(); 

    Cursor cursor = db.select("SELECT * FROM person p JOIN attendance a ON p.person_id = a.person_id WHERE training_id="+this.getId()+";"); 

    while (cursor.moveToNext()) { 
     Trainee trainee = new Trainee(); 
     trainee.setID(cursor.getInt(cursor.getColumnIndex(DatabaseHelper.PERSON_ID))); 
     trainee.setFirstname(cursor.getString(cursor.getColumnIndex(DatabaseHelper.PERSON_FIRSTNAME))); 
     trainee.setLastname(cursor.getString(cursor.getColumnIndex(DatabaseHelper.PERSON_LASTNAME))); 
     //TODO 

     // Pass to the arraylist 
     this.traineeArrayList.add(trainee); 
    } 
} 

/* returns the title of training in training ;ist. 
* @see java.lang.Object#toString() 
*/ 
@Override 
public String toString() { 

    return title; 
} 

我的主要活動類:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    portfolio = new Portfolio(this); 

    trainingListAdapter = new ArrayAdapter<Training>(this, 
      android.R.layout.simple_list_item_1, 
      portfolio.getTrainingArrayList()); 

    setListAdapter(trainingListAdapter); 
+0

在主要活動中調試portfolio.getTrainingArrayList()。 –

回答

0

使用

while (cursor.moveToNext()) { 
... 
} 

光標在第一行之前開始。在第一次迭代時,如果它存在,則會移至第一個結果。如果光標是空的,或最後一行已經被處理,則循環退出

+0

它沒有幫助。我已經嘗試過了。 – user3099195

+0

我有構造函數,但在創建Training training = new Training()時; 。構造函數Training不可見。 – user3099195

0

用途:

// move the cursor pointer to position zero. 
     cursor.moveToFirst(); 

      // if there is data after the current cursor position, add it 
      // to the ArrayList. 
      if (!cursor.isAfterLast()) 
      { 
       do 
       { 
     // get `training` data   
     trainingArrayList.add(training); 
       } 
       // move the cursor's pointer up one position. 
       while (cursor.moveToNext()); 
      } 
0

問題:

你要的Training同一個實例分配數據在你的Portfolio類中。

Training training = Training.getInstance(); 

上面的代碼會給你同樣的實例,並且你每次都向ArrayList添加同樣的引用。由於對象是靜態的,這就是爲什麼最後一次迭代的數據將在Training類變量中更新,因此您得到的是谷歌和谷歌,因爲谷歌是您最後一次迭代的數據。

解決方案:

就這樣每次迭代新Training對象:

Training training = new Training(); 
0

你永遠只能創建培訓對象的一個​​實例。實際上你已經實現了單例模式。每次將光標前進到下一個記錄時創建一個新的培訓對象 -

if (cursor.moveToFirst()) { 

    while (cursor.isAfterLast() == false) { 


     Training training = new Training(cursor.getInt(cursor 
       .getColumnIndex(DatabaseHelper.TRAINING_ID)), 
       cursor.getString(cursor 
       .getColumnIndex(DatabaseHelper.TRAINING_TITLE)) 
       cursor.getString(cursor 
       .getColumnIndex(DatabaseHelper.TRAINING_DESCRIPTION)) 
       cursor.getString(cursor 
       .getColumnIndex(DatabaseHelper.TRAINING_DATE)) 
       cursor.getString(cursor 
       .getColumnIndex(DatabaseHelper.TRAINING_LOCATION)) 
      ); 
     this.trainingArrayList.add(training); 
     cursor.moveToNext(); 
    } 


public class Training { 

private static Training instance = null; 

// global variables 
public int id; 
public String title; 
public String description; 
public String date; 
public String location; 
private Trainer trainer; 

private ArrayList<Trainee> traineeArrayList; 

public Training(int id, String title, String description, String date, String location) { 
    this.id = id; 
    this.title = title; 
    this.description = description; 
    this.date = date; 
    this.location = location; 
} 
+0

我也試過這個。在這種情況下,Training的私有構造函數只需要更改爲Training(){}。 – user3099195

+0

您可以爲培訓創建一個新的公共構造函數,其中包含所有必需的參數以初始化自己 - 標識,標題,描述等 –

+0

我已經擁有它,但仍然沒有使用培訓類私人培訓(){}構造函數 – user3099195