2011-07-12 16 views
3

私はちょうど基本的なAndroidの開発を開始しており、ListViewを実験し、SimpleCursorAdapterと統合しています。私は多くのオンラインコードサンプルを見ていますが、私はリファレンスとして使う本もあります(Professional Android 2 Application Development)。ListViewの行IDと位置インデックスの混乱

本書では、自動的にインクリメントする整数、プライマリキーフィールドを持つSQLiteデータベースにリスト項目を格納するTo-Doリストアプリケーションの例を取り上げています。

ユーザーは新しいリストアイテムを作成できますが、選択したアイテムをリストから削除することもできます。コードでは、削除が発生すると、項目のrowidとは対照的に、項目のposition属性によって主キー項目が制限されます(SQL文のWHERE句内)。

私には、これは誤った実装のようです。 AUTOINCREMENTのSQLiteドキュメントを見ると、この値は常に増加し、古い値は決して同じテーブルで再使用されないという。したがって、リストにあるものを削除して追加する場合、位置と行IDがむしろ速やかに同期しなくなる可能性があります。

ローのIDがデータベーステーブルに「インデックスする」正しい方法であると仮定し、ではなく、リストの位置をとしますか?私はその位置が普通のListAdapterを使用している場合は安全だと考えていますが、データベースにインデックスを付けるときは適切ではないようです。

あなたが特定のリスト項目にカーソルを取得する位置を使用することができます(このカーソルが行IDに対応した「テーブル」の「行」になります)
+0

リストの位置を使用して行IDを取得し、行IDを削除するだけではありませんか? –

+0

'return db.delete(DATABASE_TABLE、KEY_ID +" = "+ _rowIndex、null)> 0;' _rowIndex'は行IDではなく項目の位置です。 。これは、コンテキストメニューのコールバックから呼び出され、 'menuInfo.position'を' _rowIndex'として渡します。 –

+0

今すぐお答えします –

答えて

0

これは間違いなく練習です。私は常に行IDを削除するために使用し、カーソルの行IDを取得するために位置idを使用します。私は自宅でその本の初版を持っています、私は後でそれを見ていきます。

1

Cursor cursor = (Cursor)parent.getItemAtPosition(pos); 
int rowCol = c.getColumnIndex("_id"); 

次にあなたがすべきそれを参照してくださいcursor.getLong(rowCol) == id

+0

これは賢明です。内部的には、リストはどのように位置が行にマップされるかを知っているので、 'getItemAtPosition()'は正しい項目を返すべきです。ありがとう! (まだそれが本でやっている方法ではなく、私が見つけた最初のエラーではない)。 –