2013-10-14 144 views
0

这是我在SO的第一个问题。所以,这是我的问题:我正在开发一个android应用程序。这是我的应用程序如何流动:
当应用程序调用SQLiteOpenHelper时,Android应用程序停止

  • 我调用MainActivity;
  • 用户按下一个按钮,调用LoginActivity;
  • 用户填写用户名和密码;
  • LoginActivity调用发送JAX-WS数据的AsynchronousTask(我使用kso​​ap2库来调用我的SOAP Web服务);
  • 如果信息正确,则调用MenuActivity;
  • 有一个“车牌搜索”按钮。当它被按下时,我打电话给一个活动输入车牌和一个“确定”按钮进行搜索;
  • 当按下“OK”按钮时,我发送一个新的AsynchronousTask的数据,用于搜索我的Web服务中的板;
  • 如果车牌是有效的(活动结果= OK),我用我的数据库填充:牌照号码,年份,模型和开发人员;
  • 在此之后,我打电话给一个名为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 (因为我通过startActivityForResult()调用SearchActivity),但它在那里停止,当它应该调用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

相关问题