这是我在SO的第一个问题。所以,这是我的问题:我正在为Android开发一个应用程序。这就是我的应用程序的流程:
当我尝试向用户显示信息时,问题就出现了。这是我的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,它调用Custom 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();
用户界面返回到MenuActivity(因为我通过startActivityForResult()调用了SearchActivity)但它停在那里,当它应该调用ResultActivity时。
在logcat中,此消息以循环方式运行:
D/dalvikvm(28637): GC_CONCURRENT freed 631K, 15% free 18650K/21824K, paused 1ms+4ms, total 25ms<br>
如果我评论上面的特定行,应用程序“正常”运行并调用结果活动,但信息是空的(当然)。
有谁知道我该怎么做?
答案 0 :(得分:1)
此循环永远不会终止,因为游标永远不会在循环内前进,isAfterLast()
的返回值不会改变。
while (!cursor.isAfterLast()) {
}
由于您只对第一个结果感兴趣,请将其更改为
if (cursor.moveToFirst()) {
}
您可以将之前的moveToFirst()
电话删除为冗余电话。检查返回值仍然很重要,因为可能没有结果行,然后moveToFirst()
返回false。