私はこれに対する答えを一日中探していたので、誰かが私を助けてくれることを願っています。
SQLite DBから作成されたListViewからアイテムを選択し、それを文字列に返して、SQLコマンドを実行してDBからレコードを削除できるようにするコードがあります。ただし、エントリをクリックすると、選択したものではなく、その下のエントリからデータが返されるため、間違ったインデックスを選択していると思われます。
Adam、Bob、Charlieのように3つのエントリがある場合、Adamをクリックすると、Bobが文字列に戻ります。ボブをクリックすると、チャーリーが返されます。Charlieをクリックすると、IndexOutOfBoundsExceptionがスローされます。
私のコードは次のとおりです。
public class viewdb extends ListActivity {
private static final int DELETE_ID = Menu.FIRST + 1;
private static final int EDIT_ID = Menu.FIRST + 2;
private ArrayList<String> results = new ArrayList<String>();
private String tableName = DBAdapter.DATABASE_TABLE;
private SQLiteDatabase newDB;
String strfieldName;
String strSelFN;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("CalledActivity", "OnCreate");
Intent in = new Intent();
openAndQueryDatabase();
displayResultList();
registerForContextMenu(getListView());
}
public void displayResultList() {
TextView tView = new TextView(this);
tView.setText("Fields in Database");
getListView().addHeaderView(tView);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, results));
getListView().setTextFilterEnabled(true);
}
public void openAndQueryDatabase() {
try {
DatabaseHelper dbHelper = new DatabaseHelper(
this.getApplicationContext());
newDB = dbHelper.getWritableDatabase();
Cursor c = newDB.rawQuery("SELECT Field_Name FROM " + tableName,
null);
if (c != null) {
if (c.moveToFirst()) {
do {
strfieldName = c.getString(c.getColumnIndex("Field_Name"));
results.add(strfieldName);
} while (c.moveToNext());
}
}
} catch (SQLiteException se) {
Log.e(getClass().getSimpleName(),
"Could not create or open the database");
newDB.close();
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Object o = this.getListAdapter().getItem(position);
strSelFN = o.toString();
getListView().showContextMenu();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Entry Menu");
menu.add(Menu.NONE, EDIT_ID, Menu.NONE, R.string.strEdit);
menu.add(Menu.NONE, DELETE_ID, Menu.NONE, R.string.strDelete);}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == DELETE_ID) {
// newDB.execSQL("DELETE FROM " + tableName +
// " WHERE Field_Name = '" + strSelFN + "'");
Toast.makeText(this, "Field Deleted: " + strSelFN,
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
}
主にDELETE_ID関数が機能する必要があるため、まだEDIT_IDを定義していません。
ありがとう