Ошибка при удалении элемента из listview в android

Я хотел узнать, как использовать sqliteв android, поэтому я использовал следующий код с веб-сайта учебников, но когда я запустил его , если я удалю первую запись в listviewследующей записи даст

андроид.база данных.CursorIndexOutOfBoundsException: запрошен индекс -1,
с размером 0 в DisplayContactклассе.

Поэтому я хотел знать, как это исправить, я не знаю, находится ли проблема в listview или arraylist.

Спасибо заранее.

Вот код, который показывает ошибку

    Bundle extras = getIntent().getExtras();
        if (extras != null)
{
            int Value = extras.getInt("id");
            if (Value > 0)
{
                Cursor rs = mydb.getData(Value);
                id_To_Update = Value;
                if (rs != null && rs.getCount() > 0)
{
                    rs.moveToFirst();
                }

String dat = rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_DATE));
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));
String nam = rs.getString(rs.getColumnIndex(DBHelper.CONTACTS_COLUMN_NAME));
if (!rs.isClosed())
{
rs.close();
}

А вот код для удаления записи

    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)
{ }
}
);
                AlertDialog d =builder.create();
                d.setTitle("Are you sure?");
                d.show();
                return true;
            default:

Это выход logcat 05-20

12:59:33.953 E/AndroidRuntime(25513): Process: com.myelse.sqlcontacts, PID: 25513
    05-20 12:59:33.953 E/AndroidRuntime(25513): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myelse.sqlcontacts/com.myelse.sqlcontacts.DisplayContact}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
    05-20 12:59:33.953 E/AndroidRuntime(25513): at com.myelse.sqlcontacts.DisplayContact.onCreate(DisplayContact.java:51)

Edit: это код для arraylist и arrayadapter в mainactivity

super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mydb = new DBHelper(this);
    ArrayList arraylist = mydb.getAllContacts();
    arrayadapter= new ArrayAdapter (this, android.R.layout.simple_list_item_1 ,arraylist);
    arrayadapter.notifyDataSetChanged();
    obj = (ListView) findViewById(R.id.listView1);
    obj.setAdapter(arrayadapter);
    obj.setOnItemClickListener(new OnItemClickListener() {


            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
            {
                int id_to_search=arg2+1;
                Toast.makeText(getApplicationContext(), id_to_search + "" , Toast.LENGTH_SHORT).show();
                Bundle dataBundle = new Bundle();
                dataBundle.putInt("id", id_to_search);
                Intent intent = new Intent(getApplicationContext(), DisplayContact.class);
                intent.putExtras(dataBundle);
                startActivity(intent);
                arrayadapter.notifyDataSetChanged();
            }
        }

    );

}

3 ответа

  1. Проблема в линии:

    Cursor rs = mydb.getData(Value);
    

    mydb.getData (Value) вернет только одну строку, где «id» = Value

    Таким образом, при удалении одной строки курсор возвращает исключение IndexOutOfBoundsException .

    Одним из возможных решений является изменение getDataфункции следующим образом:

           public Cursor getData(){
              SQLiteDatabase db = this.getReadableDatabase();
              Cursor res =  db.rawQuery( "select * from contacts, null );
              return res;    
    }
    
  2. Спасибо @parth mehta за ответ, но единственным решением, которое я нашел для сохранения порядка после удаления записи, было скопировать все записи во временную таблицу без столбца id, а затем перемещать их обратно в исходную таблицу после каждого удаления.
    Использование insert into table 1 () Выберите из табл.2.

    Спасибо.

  3. Пожалуйста, добавьте Notifydatsetchange () после удаления события