SQLiteデータベースとListView
がメインアクティビティに表示されています。 ListView
には、各リスト番号の詳細が表示され、リスト項目を押すと、詳細が表示される新しいアクティビティが開きます(TextView
)。SQLite行IDがListView行IDと一致しません
これらはそれぞれListView
の削除機能があり、正常に動作しません。基本的には、作成されたそれぞれにユニークなIDが与えられます。ListView
は、SQLiteデータベースの動作方法です。ただし、ListView
内の行を削除すると、一意のIDは増加しますが、行IDはその番号を削除してすべてを上に移動します。つまり、アイテムを削除すると、ローIDとデータベースIDが一致しなくなり、ListView
内のアイテムを選択しようとするとクラッシュします。これは私のデータベースアダプタクラスの抜粋です。
public Integer deleteStat(Integer id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(STATS_TABLE, "id = ? ", new String[]{Integer.toString(id)});
}
これは私の主な活動の最初の試みです。私はthisポストからいくつかの情報を得たが、正しい整数を取得するために失敗し、構文エラーを受信:
obj.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
TextView pos = (TextView) findViewById(R.id.editTitle);
displayText(Integer.parseInt(pos.getText().toString()));
}
});
}
public void displayText(int pos)
{
pos++;
String s = "";
s += pos;
Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);
intent.putExtra("id", s);
startActivity(intent);
}
これが主な活動で、私の第二の試みです。私はthisチュートリアルを使って私を助けました。そのウェブサイトから私が使用したコードは、削除機能全体を破壊しました。
obj.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
int id_To_Search = arg2 + 1;
int id_To_Search = arg0.getCount() - arg2;
Bundle dataBundle = new Bundle();
dataBundle.putInt("id", id_To_Search);
Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);
intent.putExtras(dataBundle);
startActivity(intent);
どのようにしてデータベースIDを行IDと一致させることができますか?どのようにそれを行うための任意の提案?
EDIT:ハッシュマップコードに追加されました。私はListView項目で押すと、何もあなたがデータベース内の行を削除するListView
位置を渡すことはありません
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mydb = new StatisticsDbAdapter(this);
ArrayList array_list = mydb.getAllStats();
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array_list);
obj = (ListView) findViewById(R.id.listView1);
obj.setAdapter(arrayAdapter);
/*
New code starts here
*/
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 cursor = mydb.getData(Value);
hashMap.put(cursor.getString(1), cursor.getInt(0));
obj.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int arg2, long arg3) {
TextView textView = (TextView) view.findViewById(R.id.editTitle);
Bundle dataBundle = new Bundle();
dataBundle.putInt("id", hashMap.get(textView.getText().toString()));
Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class);
intent.putExtras(dataBundle);
startActivity(intent);
}
});
}
}
}
'SQLiteの行IDがListViewと一致しません。これは明らかです。あなたのIDが953で始まるとしましょう(多くの試行を行い、すべてのテストレコードを何度も削除したためです)。 ListViewはアイテム番号953から始まるとふりまといますか?いいえ、明らかにそうではありません。それはITSアイテム番号0でそのアイテムにデータを入力し始めます。 –
データベースIDがリストビューから行を削除した後、データベースIDを呼び出してコールバックすると、データベースIDがそのラインIDと一致するようにするにはどうすればいいですか? –
Googleのキーワード: 'android listview database delete' –