2011-10-26 14 views
1

データベースを使い慣れていないので、私のエラーが正直であるところがどこにあるのか分かりません。SQL DBは1つの行しか保持しませんか?

のいくつかをログに記録するカーソルを使用し

 public Cursor fetchAllJobs() { 

    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_COMPANY, 
      KEY_ADVERTISED, KEY_STATUS, KEY_POSITION, KEY_WAGE, KEY_HOURS, 
      KEY_ADDRESS, KEY_EMAIL, KEY_NUMBER, KEY_NOTES}, null, 
      null, null, null, null); 
} 

テーブル内のすべての行にカーソルを取得する行

 public long createJob(String company, String advertised, String status, String position, String wage, String hours, 
     String address, String email, String number, String notes) { 

    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_COMPANY, company); 
    initialValues.put(KEY_ADVERTISED, advertised); 
    initialValues.put(KEY_STATUS, status); 
    initialValues.put(KEY_POSITION, position); 
    initialValues.put(KEY_WAGE, wage); 
    initialValues.put(KEY_HOURS, hours); 
    initialValues.put(KEY_ADDRESS, address); 
    initialValues.put(KEY_EMAIL, email); 
    initialValues.put(KEY_NUMBER, number); 
    initialValues.put(KEY_NOTES, notes); 

    return mDb.insert(DATABASE_TABLE, null, initialValues); 
} 

を作成するデータベース

private static final String DATABASE_CREATE = 
    "create table job_details (_id integer primary key autoincrement, " 
    + "company text not null, advertised text, status text not null, position text not null, " + 
    "wage text, hours text, address text, " + 
    "email text, number text, notes text);"; 

    @Override 
    public void onCreate(SQLiteDatabase db){ 
     db.execSQL(DATABASE_CREATE); 
    } 

の作成:ここに私のコードですすべての行の属性

private void getAllData(){ 
    Cursor c = mDbHelper.fetchAllJobs(); 
    startManagingCursor(c); 
    do{ 
     if(c.moveToFirst()){ 
      String company; 
      String position; 
      String number; 

      int companyColumn = c.getColumnIndex(JobsDbAdapter.KEY_COMPANY); 
      int positionColumn = c.getColumnIndex(JobsDbAdapter.KEY_POSITION); 
      int numberColumn = c.getColumnIndex(JobsDbAdapter.KEY_NUMBER); 

      do{ 
       company = c.getString(companyColumn); 
       position = c.getString(positionColumn); 
       number = c.getString(numberColumn); 
      }while(c.moveToNext()); 

      Log.d(TAG, "Company is = "+company); 
      Log.d(TAG, "Position is = "+position); 
      Log.d(TAG, "Number is = "+number); 
     } 
    }while(c.moveToNext()); 
} 

このコードを使用すると、出力/ログに記録された値は、データベースに入力しようとした最後の行に含まれている値だけになります。私は間違ったデータを入力しているのか、間違ったデータベースを探しているのか分かりません。

+0

SQLが混乱する場合は、Active Record(http://martinfowler.com/eaaCatalog/activeRecord.html)またはData Mapper(http://martinfowler.com/eaaCatalog/dataMapper.html)でDBアクセスをカプセル化することを検討してください)タイプのアプローチ –

答えて

2

これは正しくありません。

do{ 
      company = c.getString(companyColumn); 
      position = c.getString(positionColumn); 
      number = c.getString(numberColumn); 
     }while(c.moveToNext()); 

カーソルが実際にそれを移動する必要はありませんあなたを指しているものを読みたいときに。カーソルが完全なレコードを指しています。

また、if文はカーソルを最初の結果に戻します。それはおそらくあなたが最初の行だけを見ていた理由です。代わりにこれを試してください。

private void getAllData(){ 
    Cursor c = mDbHelper.fetchAllJobs(); 
    startManagingCursor(c); 

    while(c.moveToNext()){ 

     String company; 
     String position; 
     String number; 

     int companyColumn = c.getColumnIndex(JobsDbAdapter.KEY_COMPANY); 
     int positionColumn = c.getColumnIndex(JobsDbAdapter.KEY_POSITION); 
     int numberColumn = c.getColumnIndex(JobsDbAdapter.KEY_NUMBER); 


     company = c.getString(companyColumn); 
     position = c.getString(positionColumn); 
     number = c.getString(numberColumn); 


     Log.d(TAG, "Company is = "+company); 
     Log.d(TAG, "Position is = "+position); 
     Log.d(TAG, "Number is = "+number); 
    } 
} 
+0

これはより良いループ構造ですが、元のコードに何が間違っているかは説明しません。 –

+0

あなたの権利、私は彼のループが間違っている理由を知っていますが、なぜそれが間違っているのか説明する手間を掛けませんでした。私はそれをするべきです。私は私の答えを変更します。 –

+0

ありがとう、私は今、私がc.movetofirst()がしたことと混同していたことが分かります。私のループを無視したコードのSQL部分に集中していました。 – Shane

0

問題はデータベースにありループではないと確信していますか?私は手動でデータベースに接続し、そのテーブルに対してSELECTを実行しようとします。私はあなたのカーソルとすべての行を印刷していないあなたのループで起こっている可能性があるファンキーなことがあると思う。

4

ループを見てください。

​​

カーソルは、本のページをめくるように考えることができます。このブロック内:

do{ 
      company = c.getString(companyColumn); 
      position = c.getString(positionColumn); 
      number = c.getString(numberColumn); 
     }while(c.moveToNext()); 

最後のページに切り替えました。だからあなたがログするとき、あなたは最後のものです。

+0

いいアナロジー。 15chars – Pedantic

+0

ありがとうございました。私はそれが技術的に正確であるかどうかはわかりませんでしたが、私はそのコンセプトを伝える簡単な方法を望んでいました。うれしいことは嬉しいです。 –

+0

正解で有用です。 – Pedantic

関連する問題