我想学习如何在android中使用sqlite
,所以我在教程网站上使用了以下代码但是当我运行它时,如果我删除了listview
中的第一个条目,那么下一个条目就会给
android.database.CursorIndexOutOfBoundsException:索引-1请求,
DisplayContact
类中的大小为0。
所以我想知道如何修复它,我不知道问题是在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)
编辑:这是mainactivity中的arraylist和arrayadapter的代码
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 :(得分:0)
问题在于:
Cursor rs = mydb.getData(Value);
mydb.getData(Value)只返回一行,其中&#34; id&#34; =值
因此,当您删除此单行时,游标将返回 IndexOutOfBoundsException 。
一种可能的解决方案是修改getData
函数,如下所示:
public Cursor getData(){
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from contacts, null );
return res;
}
答案 1 :(得分:0)
感谢@parth mehta的回复,但我发现在删除条目后保留顺序的唯一解决方案是将所有记录复制到没有id列的临时表,然后在每个记录后将它们移回原始表删除。 使用insert into table 1()从table2中选择。
感谢。
答案 2 :(得分:0)
请在删除事件
后添加Notifydatsetchange()