2013-10-14 142 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

相關問題