2013-12-16 4 views
0

Я пытаюсь получить список Array, используя SELECT * from tableName. Но я просто получаю последний ряд только странным образом. Я демонстрирую пример. У меня всего две строки данных, которые я накладываю вручную. Предположим, что данные StackOverFlow и Google с идентификаторами 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(); 
     } 
    } 

My Training Класс:

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

debug portfolio.getTrainingArrayList() в вашей основной деятельности. –

ответ

0

Использование

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

Курсор начинает перед первой строкой. На первой итерации он переходит к первому результату, если он существует. Если курсор пуст, или последняя строка была уже обработана, то петля выходит

+0

Это не помогло. Я уже пробовал. – user3099195

+0

У меня есть конструктор, но при создании Training training = new 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. Поскольку объект статичен, поэтому данные последней итерации будут обновляться в переменной класса обучения, поэтому вы получаете google и google, потому что Google был последними вашими данными итерации.

Решение:

Сделать новый объект Training на каждой итерации, как это:

Training training = new Training(); 
0

Вы только когда-либо создать один экземпляр вашего объекта Training. Эффективно вы реализовали одноэлементный шаблон. Создайте новый объект обучения каждый раз, когда вы переместите курсор к следующей записи -

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() {}. – user3099195

+0

Вы можете создать новый публичный конструктор для обучения, который принимает все необходимые параметры для инициализации - id, title, description и т. Д. –

+0

У меня это уже есть, но все же класс обучения не принимает частный Training() {} конструктор – user3099195

Смежные вопросы