2013-10-14 1 views
0

Это мой первый вопрос здесь, в SO. Итак, вот моя проблема: я разрабатываю приложение для Android. Вот как работает мое приложение:
Приложение для Android останавливается при вызове SQLiteOpenHelper

  • Я называю MainActivity;
  • Пользователь нажимает кнопку, которая вызывает функцию LoginActivity;
  • Пользователь вводит имя пользователя и пароль;
  • LoginActivity вызывает AsynchronousTask, который отправляет данные для JAX-WS (я использую библиотеку ksoap2 для вызова моей веб-службы SOAP);
  • Если информация правильная, вызывается MenuActivity;
  • Существует кнопка «Поиск лицензионных номеров». Когда он нажимается, я вызываю действие для ввода номерного знака и кнопку «ОК» для поиска;
  • Когда нажата кнопка «ОК», я отправляю данные для новой AsynchronousTask, которые ищут тарелку в моей веб-службе;
  • Если номерной знак является действительным (результат деятельности = ОК), я заполняю свою базу данных: номером номерной платы, годом, моделью и разработчиком;
  • После этого я вызываю новое мероприятие под названием ResultActivity, где отображается информация о транспортном средстве в новом диалоге (ЗДЕСЬ ПРОБЛЕМА);
  • Но если в результате ОТМЕНА (если моя веб-служба не нашла номерной знак), я просто покажу предупреждение для пользователя.

Проблема возникает, когда я пытаюсь показать информацию для пользователя. Вот мой ResultActivity:

public class ResultadoBuscaPlacaActivity extends Activity { 

    private VeiculoDAO vDao; 

    TextView campoPlaca; 
    TextView campoModelo; 
    TextView campoMarca; 
    TextView campoAno; 
    TextView campoRenavam; 
    TextView campoProprietario; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_resultado_busca_placa);    
     campoPlaca = (TextView) findViewById(R.id.valor_placa); 
     campoModelo = (TextView) findViewById(R.id.valor_modelo); 
     campoMarca = (TextView) findViewById(R.id.valor_marca); 
     campoAno = (TextView) findViewById(R.id.valor_ano); 
     campoRenavam = (TextView) findViewById(R.id.valor_renavam); 
     campoProprietario = (TextView) findViewById(R.id.valor_proprietario);  
     vDao = new VeiculoDAO(this); 
     vDao.open();  

    } 

    public void confirm(View v){   
     finish(); 
    }  

    @Override 
    protected void onStart() {  
     super.onStart(); 
     Veiculo v = new Veiculo(); 
     v = vDao.getFirstElement(); 
     if (v.getPlaca()!=null){ 
      campoPlaca.setText(v.getPlaca()); 
      campoModelo.setText(v.getModelo()); 
      campoMarca.setText(v.getMarca()); 
      campoAno.setText(v.getAno()); 
      campoRenavam.setText(v.getRenavan().toString()); 
      campoProprietario.setText(v.getNomeProprietario()); 
     }   
    } 

    @Override 
    protected void onDestroy() { 
     vDao.close(); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 
     vDao.close(); 
     super.onPause(); 
    }  
} 

VeiculoDAO простой DAO, который вызывает пользовательский класс SQLiteOpenHelper. Метод getFirstElement() здесь:

public Veiculo getFirstElement(){ 

     Cursor cursor = database.query(CustomSQLiteOpenHelper.TABLE_VEICULO, 
       columns, null, null, null, null, null); 
     cursor.moveToFirst(); 
     Veiculo v = new Veiculo(); 

     while (!cursor.isAfterLast()) { 

      v.setAno(cursor.getInt(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_ANO))); 
      v.setMarca(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_MARCA))); 
      v.setModelo(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_MOD))); 
      v.setNomeProprietario(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_NMPROP))); 
      v.setPlaca(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_PLACA))); 
      v.setRenavan(cursor.getLong(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_MARCA)));   
     } 
     cursor.close(); 
     return v; 
} 

Что на самом деле происходит: когда результат деятельности вызывает метод OnStart() и идет к линии:

v = vDao.getFirstElement(); 

UI восходит к MenuActivity (потому что я назвал SearchActivity startActivityForResult()), но он останавливается там, когда он должен вызвать ResultActivity.
В LogCat, это сообщение работает в цикле:

D/dalvikvm(28637): GC_CONCURRENT freed 631K, 15% free 18650K/21824K, paused 1ms+4ms, total 25ms<br> 

Если я комментирую конкретную строку выше, приложение работает «нормально», и результат деятельности называется, но информация пустые (конечно).

Кто-нибудь знает, что мне делать?

ответ

1

Этот цикл никогда не заканчивается, так как курсор никогда не продвигается внутри цикла, и возвращаемое значение isAfterLast() не изменяется.

while (!cursor.isAfterLast()) { 

} 

Поскольку вы заинтересованы только в первый результат, изменить его

if (cursor.moveToFirst()) { 

} 

Вы можете удалить ранее moveToFirst() вызов избыточными. По-прежнему важно проверить возвращаемое значение, так как не может быть строк результата, а затем moveToFirst() возвращает false.

+0

Спасибо! Я думаю, что это ответ;). Но у меня есть сомнения: есть ли разница в использовании: в то время как (cursor.moveToNext()) {} вместо: (! Cursor.isAfterLast()) время { cursor.moveToNext(); } ? – gcgoll

+0

@gcgoll. В теории возможно, что 'moveToNext()' может произойти по другим причинам, чем курсор, указывающий после последней строки. На практике нет никакой разницы. Помимо этого, всегда рекомендуется проверять возвращаемое значение вызовов, которые могут завершиться неудачей. – laalto