2011-10-26 2 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()); 

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

Также, если ваш статус всегда перемещает курсор к первому результату. Вероятно, поэтому вы видели только первую строку. Попробуйте это вместо этого.

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{ 
    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()); 

Вы можете думать о курсоре, как о переводе страниц в книге. В этом блоке:

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

Вы превратили страницу в последнюю. Поэтому, когда вы регистрируетесь, вы на последнем.

+0

Nice аналогию. 15chars – Pedantic

+0

Спасибо. Я не был уверен, был ли он наиболее технически точным, но мне нужен простой способ передать концепцию. Рад, что это имеет смысл. –

+0

Правильно и полезно. – Pedantic

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