2011-10-26 53 views
1

新的使用數據庫,所以不知道我的錯誤在哪裏說實話。這裏是我的代碼:SQL DB只保存一行?

創建數據庫

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); 
    } 

創建一行

 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); 
} 

獲取遊標的所有行表

 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); 
} 

使用光標登錄一些所有行的屬性

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)封裝數據庫訪問)類型的方法 –

回答

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