2013-07-17 42 views
0

我在我的用戶註冊活動中編輯了文本的(用戶名,名,姓和電子郵件地址)。用戶有權搜索他輸入的用戶名是否已經存在,方法是單擊搜索按鈕。如果用戶名已存在,則會顯示與該用戶名相關的所有信息,如用戶姓名。然而,如果用戶點擊按鈕,如果它不存在,我的應用程序崩潰,我得到CursorIndexOutOfBoundsException錯誤。我怎樣才能調試那個?搜索按鈕在Android中單擊時檢索數據庫中的數據

MainActivity.java

btn_Search.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     String searchableUser = txt_User.getText().toString(); 

     ConsUserRegistration consUserRegistration = db.searchUser(searchableUser); 

     String searchUser = consUserRegistration.getUser().toString(); 
     String searchFirst = consUserRegistration.getFirstName().toString(); 
     String searchLast = consUserRegistration.getLastName().toString(); 
     String searchEmail = consUserRegistration.getEmail().toString(); 

     txt_User.setText(searchUser); 
     txt_First.setText(searchFirst); 
     txt_Last.setText(searchLast); 
     txt_Email.setText(searchEmail);    
    } 
}); 

DatabaseHandler.java

public ConsUserRegistration searchUser(String username){ 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(Constants.TABLE_USER, new String[] {Constants.KEY_USER, Constants.KEY_FIRST, 
      Constants.KEY_LAST, Constants.KEY_EMAIL}, Constants.KEY_USER + " =? ", 
      new String[] { String.valueOf(username) }, null, null, null); 
    if (cursor != null) 
     cursor.moveToFirst(); 

    ConsUserRegistration search = new ConsUserRegistration (cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3)); 

    return search; 

} 
+0

當它崩潰時,你可以得到一個堆棧跟蹤。我認爲崩潰發生在你的數據庫處理程序中,因爲你試圖訪問一個遊標而不檢查它是否爲空。在移至第一個位置之前檢查它是否爲空,但無論如何訪問它。 – ObieMD5

+1

那麼我怎麼能編碼它沒有相同的錯誤? – androidBoomer

回答

1

試試這個:

MainActivity.java

btn_Search.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     String searchableUser = txt_User.getText().toString(); 

     ConsUserRegistration consUserRegistration = db.searchUser(searchableUser); 
     if (consUserRegistration != null){ 

      String searchUser = consUserRegistration.getUser().toString(); 
      String searchFirst = consUserRegistration.getFirstName().toString(); 
      String searchLast = consUserRegistration.getLastName().toString(); 
      String searchEmail = consUserRegistration.getEmail().toString(); 

      txt_User.setText(searchUser); 
      txt_First.setText(searchFirst); 
      txt_Last.setText(searchLast); 
      txt_Email.setText(searchEmail); 
     }else{ 
     Toast.makeText(getApplicationContext(), "Username Not Found", Toast.LENGTH_LONG).show(); 
     }    
    } 
}); 

DatabaseHandler.java

public ConsUserRegistration searchUser(String username){ 
    ConsUserRegistration search; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(Constants.TABLE_USER, new String[] {Constants.KEY_USER, Constants.KEY_FIRST, 
      Constants.KEY_LAST, Constants.KEY_EMAIL}, Constants.KEY_USER + " =? ", 
      new String[] { String.valueOf(username) }, null, null, null); 
    if (cursor != null && cursor.moveToFirst()){ 
      search = new ConsUserRegistration (cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3)); 
     }else{ 
      search = null; 
     } 

    return search; 

} 
+1

我認爲它應該是如果(consUserRegistration!= null){因爲我想獲得輸入的值,並且如果用戶沒有填寫任何,我應該敬酒一條消息。 還有一件事,我不太熟悉錯誤處理。你能幫助我嗎? – androidBoomer

+0

這就是你放置你的代碼的地方,如果用戶名是可用的。在上面的部分中,如果存在用戶數據,則使用用戶數據填充文本框。在錯誤處理區域中,如果找不到用戶名,你可以做任何你想做的事情。像'txt_User.setText(「Not Found」);'帶着所有的盒子或東西 – ObieMD5

+0

@RanmaMarquee對於'!=',你是對的。我可以幫助您處理錯誤,但我們應該去聊天而不是在這裏,這樣他們就不會將帖子標記爲脫離主題。我還將Toast消息添加到了我的帖子中 – ObieMD5

1

所以......如果你的光標空值或沒有的元素,會發生什麼?你還在試圖訪問它...

試着像...

if (cursor != null && cursor.moveToFirst()) {  

... 
+0

那麼我該如何編碼呢?我從昨天開始就在努力... – androidBoomer

+0

....你看過我的回答嗎? – dispake

+0

我有一個錯誤,因爲該方法返回我的構造函數,ConsUserRegistration這是'搜索'的值 – androidBoomer