2016-03-02 32 views
1

我有一個排除日期的問題,這隻有當它不是我的ArrayList中的第一個元素的最後一個元素時纔會發生。我不能刪除sqlite中的日期

Why does this happen and how to solve? 
Example: 
| ID | 
    : 
Gil <- problem deleting this line 
Rui <- problem deleting this line 
Ana <- no problem 

I'm implementing the example of this site: http://www.tutorialspoint.com/android/android_sqlite_database.htm

error: Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

代碼

public Integer deleteContact (Integer id, ArrayList<Integer> array_List) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 

    db.delete("contacts", "id = ? ", new String[]{Integer.toString(id)}); 

    db.close(); 
    return id; 
} 


public ArrayList<String> getAllCotacts() 
{ 
    ArrayList<String> array_list = new ArrayList<String>(); 

    //hp = new HashMap(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from contacts", null); 
    res.moveToFirst(); 

    while(res.isAfterLast() == false){ 
     array_list.add(res.getString(res.getColumnIndex(CONTACTS_COLUMN_NAME))); 
     res.moveToNext(); 
    } 
    return array_list; 
} 

public Cursor getData(int id){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select * from contacts where id="+id+"", null  ); 
    return res; 
    } 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_display_contact); 
    name = (TextView) findViewById(R.id.editTextName); 
    phone = (TextView) findViewById(R.id.editTextPhone); 
    email = (TextView) findViewById(R.id.editTextStreet); 
    street = (TextView) findViewById(R.id.editTextEmail); 
    place = (TextView) findViewById(R.id.editTextCity); 

    mydb = new DBHelper(this); 

    Bundle extras = getIntent().getExtras(); 
    if(extras !=null) 
    { 
     int Value = extras.getInt("id"); 

     if(Value>0){ 
      //means this is the view part not the add contact part. 
      Cursor rs = mydb.getData(Value); 
      id_To_Update = Value; 
       if (rs.moveToFirst()) { 
        do { 
         if (rs != null && rs.getCount()!= 0){ 
          id_To_Update = Value; 
String nam = rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_NAME)); 
String phon=rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_PHONE)); 
String emai=rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_EMAIL)); 
String Stree=rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_STREET)); 
String plac = rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_CITY)); 

          Button b = (Button) findViewById(R.id.button1); 
          b.setVisibility(View.INVISIBLE); 

          name.setText((CharSequence) nam); 
          name.setFocusable(false); 
          name.setClickable(false); 

          phone.setText((CharSequence) phon); 
          phone.setFocusable(false); 
          phone.setClickable(false); 

          email.setText((CharSequence) emai); 
          email.setFocusable(false); 
          email.setClickable(false); 

          street.setText((CharSequence) stree); 
          street.setFocusable(false); 
          street.setClickable(false); 

          place.setText((CharSequence) plac); 
          place.setFocusable(false); 
          place.setClickable(false); 

         } 
        } while (rs.moveToNext()); 

         if (!rs.isClosed()) { 
          rs.close(); 
         } 
       } 
      if (!rs.isClosed()) { 
       rs.close(); 
      } 

     } 
    } 
} 

public boolean onOptionsItemSelected(MenuItem item) 
{ 
    super.onOptionsItemSelected(item); 
    switch(item.getItemId()) 
    { 
     case R.id.Edit_Contact: 
      Button b = (Button)findViewById(R.id.button1); 
      b.setVisibility(View.VISIBLE); 
      name.setEnabled(true); 
      name.setFocusableInTouchMode(true); 
      name.setClickable(true); 

      phone.setEnabled(true); 
      phone.setFocusableInTouchMode(true); 
      phone.setClickable(true); 

      email.setEnabled(true); 
      email.setFocusableInTouchMode(true); 
      email.setClickable(true); 

      street.setEnabled(true); 
      street.setFocusableInTouchMode(true); 
      street.setClickable(true); 

      place.setEnabled(true); 
      place.setFocusableInTouchMode(true); 
      place.setClickable(true); 

      return true; 
     case R.id.Delete_Contact: 

      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage(R.string.deleteContact) 
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          mydb.deleteContact(id_To_Update); 
          Toast.makeText(getApplicationContext(), "Deleted Successfully", Toast.LENGTH_SHORT).show(); 
          Intent intent = new Intent(getApplicationContext(),MainActivity.class); 
          startActivity(intent); 
         } 


        }) 
        .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          // User cancelled the dialog 
         } 
        }); 
      AlertDialog d = builder.create(); 
      d.setTitle("Are you sure"); 
      d.show(); 

      return true; 
     default: 
      return super.onOptionsItemSelected(item); 

    } 
} 


public boolean onOptionsItemSelected(MenuItem item) 
{ 
    super.onOptionsItemSelected(item); 
    switch(item.getItemId()) 
    { 
     case R.id.Edit_Contact: 
      Button b = (Button)findViewById(R.id.button1); 
      b.setVisibility(View.VISIBLE); 
      name.setEnabled(true); 
      name.setFocusableInTouchMode(true); 
      name.setClickable(true); 

      phone.setEnabled(true); 
      phone.setFocusableInTouchMode(true); 
      phone.setClickable(true); 

      email.setEnabled(true); 
      email.setFocusableInTouchMode(true); 
      email.setClickable(true); 

      street.setEnabled(true); 
      street.setFocusableInTouchMode(true); 
      street.setClickable(true); 

      place.setEnabled(true); 
      place.setFocusableInTouchMode(true); 
      place.setClickable(true); 

      return true; 
     case R.id.Delete_Contact: 

      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage(R.string.deleteContact) 
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          mydb.deleteContact(id_To_Update); 
          Toast.makeText(getApplicationContext(), "Deleted Successfully", Toast.LENGTH_SHORT).show(); 
          Intent intent = new Intent(getApplicationContext(),MainActivity.class); 
          startActivity(intent); 
         } 


        }) 
        .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          // User cancelled the dialog 
         } 
        }); 
      AlertDialog d = builder.create(); 
      d.setTitle("Are you sure"); 
      d.show(); 

      return true; 
     default: 
      return super.onOptionsItemSelected(item); 

    } 
} 

public Integer deleteContact (Integer id) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete("contacts", 
      "id = ? ", 
      new String[] { Integer.toString(id) }); 
} 

錯誤使我此行的開頭:

String nam = rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_NAME)); 

回答

0

您應該檢查是否rs.move ToFist()返回false。

如果它是假的,則表示遊標爲空,所以當您試圖獲取值時,您有一個android.database.CursorIndexOutOfBoundsException。

你的getData(int)返回一個空遊標,因爲沒有你給他的id的記錄。

要刪除的數據在你的ArrayList變化:

array_list.add(res.getString(res.getColumnIndex(CONTACTS_COLUMN_NAME))); 

通過:

int idContacts =res.getInt(res.getColumnIndex(CONTACTS_ID)); 
array_list.add(idContacts, res.getString(res.getColumnIndex(CONTACTS_COLUMN_NAME))); 

然後,當你要刪除的聯繫人使用:

array_list.remove(idDelete); 
+0

我認爲在數據庫,「ID」被刪除,但不是在arraylist,但不知道 –

+0

我認爲錯誤是在這裏,因爲你試圖讓我在數據庫中記錄不存在的特定ID的記錄。因此,如果您不檢查遊標是否爲空,有時您會在此行上獲取android.database.CursorIndexOutOfBoundsException: String nam = rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_NAME)); –

+0

我修正了它,但我仍然不排除我的數組列表的數據.... –