2016-05-26 2 views
0

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

android.database.CursorIndexOutOfBoundsException: индекс -1 запрошенного, с размером 0 в DisplayContact классе.

Так что я хотел знать, как это исправить, я не знаю, есть ли проблема в списке или в 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) 

Редактировать: это код для 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(); 
      } 
     } 

    ); 

} 
+0

я предполагаю, что вам нужно повторно загрузить массив, а затем обновить ListAdapter, потому что данные изменились. – andre3wap

+0

Я попытался вызвать arraylist, который из другого класса дал мне nullpointerexception Я не знаю, как одновременно удалить из базы данных и arraylist – shahawi273

+0

мы можем увидеть код для 'ArrayList' – andre3wap

ответ

0

Благодаря @parth Мехта для Быстродействие, но единственное решение, которое я нашел, чтобы сохранить порядок после удаления записи было скопировать все записи во временную таблицу без столбца id, а затем перемещение их обратно в исходную таблицу после каждого удаления. Использование вставки в таблицу 1() выберите из таблицы2.

Спасибо.

0

Проблема заключается в строке:

Cursor rs = mydb.getData(Value); 

mydb.getData (значение) будет возвращать только одну строку, где "идентификатор" = Значение

So , когда вы удаляете эту единственную строку, курсор возвращает значение IndexOutOfBoundsException.

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

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

. Спасибо за ваш ответ, ошибка исчезла, но теперь идентификатор в представлении списка после удаления становится меньше по одному из sqldatabase, поэтому, когда я для например, нажмите на элемент в списке, я на самом деле получаю предыдущую запись, зарегистрированную в базе данных. – shahawi273

+0

Итак, помогло ли вам решить вашу проблему? –

+0

И странно в базе данных, когда я удаляю элемент с id 1, он начинается с id 2, но в списке он все еще начинается с id 1 – shahawi273

0

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

+0

Спасибо, я пробовал это, но так как адаптер объявлен в другом классе он дает исключение из null-указателя, но, как я ответил, единственным способом, который я нашел эффективным, является использование команд sql – shahawi273

Смежные вопросы