1

これを行うためにさまざまな方法を試しましたが、基本的にデータベースからすべてのデータを取得するときに配列に格納したいのですが、データがデータベースから読み取られるときにインデックスを反復処理する方法がわかりません。データを取得して配列に追加する方法は次のとおりです。

public void makeObjects(){
    i =0;
    db.open();
    for(int j = 0; j< amount; j++)
    {
        objarray.add(o); 
    }

    Cursor c = db.fetchAllNotes();
    if (c.moveToFirst())
    {

        do {      

            objarray.get(i).setid(c.getString(0));
            objarray.get(i).settitle(c.getString(1));
            objarray.get(i).setinfo(c.getString(2));
            objarray.get(i).setlat(c.getString(3));
            objarray.get(i).setlon(c.getString(4));
            objarray.get(i).setmc(c.getString(5));

            i++;
        } while (c.moveToNext());
    }



    db.close();

}

テストと単純化のために、データベースに 2 つの行があり、配列に 2 つの新しいインデックスを追加する for ループがありますが、配列の内容を にlogcat出力すると、両方のインデックスに最後のデータがあることがわかりますデータベースから 2 行目を 2 回読み取ります。行 1 がインデックス 0 に入り、行 2 がインデックス 1 に入るようにするにはどうすればよいですか?

4

3 に答える 3

2

これを行うためにさまざまな方法を試しましたが、基本的にデータベースからすべてのデータを取得するときに、それを配列に格納したいと考えています

データベースにテーブルを表示する独自のオブジェクトを作成するにはどうすればよいですか? このオブジェクトには、テーブルに列を表示するいくつかの属性があります。

そして、データベースから各行をオブジェクトのリストに保存するアルゴリズムは次のとおりです。

  1. すべての行をフェッチしますCursor
  2. ループしてCursor、行ごとに新しいオブジェクトを作成し、それをオブジェクトのリストに保存します。

例:

public class Foo {

   private int id;
   private String name;

   // getters and setters
}

メソッドの実装:

public List<Foo> getAll() {
   List<Foo> foos = new ArrayList<Foo>();
   Foo member = null;
   Cursor c = null;
   try {
      c = db.rawQuery("Select * from Table", null);
      if (c.moveToFirst()) {
         do {
            member = new Foo();
            member.setId(c.getInt(c.getColumnIndex("id")));
            member.setName(c.getString(c.getColumnIndex("name")));
            foos.add(member);
         } while (c.moveToNext());
      }
      return foos;
   }
   finally {
      if (c != null) {
         c.close();
      }
   }
}
于 2013-03-12T21:17:39.993 に答える
2

配列のすべての要素が同じオブジェクトを参照するのではなく、参照する配列の要素ごとに新しいオブジェクトを作成する必要があります。

于 2013-03-12T21:05:06.987 に答える
1

これがお役に立てば幸いです。この関数は、データベースを読み取り、行をオブジェクトとして返します。この関数は、SQLiteOpenHelper を拡張するクラスに記述されています。

ParamsBMI getTemplate(String strPersonName)
{
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_BMI_PARAMS, new String[] { KEY_PERSON_NAME, KEY_GENDER_MALE, KEY_DOB_YEAR, KEY_DOB_MOY, KEY_DOB_DOM, KEY_HEIGHT_UNIT, KEY_WEIGHT_UNIT, KEY_HEIGHT_CMS, KEY_HEIGHT_FT, KEY_HEIGHT_INCHES, KEY_WEIGHT_KGS,
            KEY_WEIGHT_POUNDS }, KEY_PERSON_NAME + "=?", new String[] { strPersonName }, null, null, null, null);

    if (cursor != null)
        cursor.moveToFirst();

    ParamsBMI paramsBMI = new ParamsBMI();

    paramsBMI.setPersonName(cursor.getString(0));

    boolean bGenderMale = (cursor.getInt(1) == 1) ? true : false;
    paramsBMI.setGenderMale(bGenderMale);

    paramsBMI.setDOBYear(Integer.parseInt(cursor.getString(2)));
    paramsBMI.setDOBMonthOfYear(Integer.parseInt(cursor.getString(3)));
    paramsBMI.setDOBDayOfMonth(Integer.parseInt(cursor.getString(4)));

    paramsBMI.setHeightUnit(Integer.parseInt(cursor.getString(5)));
    paramsBMI.setWeightUnit(Integer.parseInt(cursor.getString(6)));

    paramsBMI.setHeightCms(Float.parseFloat(cursor.getString(7)));
    paramsBMI.setHeightFt(Float.parseFloat(cursor.getString(8)));
    paramsBMI.setHeightInches(Float.parseFloat(cursor.getString(9)));

    paramsBMI.setWeightKgs(Float.parseFloat(cursor.getString(10)));
    paramsBMI.setWeightPounds(Float.parseFloat(cursor.getString(11)));

    return paramsBMI;
}
于 2013-03-12T21:25:11.970 に答える