3

Android アプリで SQLite を使い始めています。私はデータベースを初めて使用するわけではありません。Delphi を使用してデータベースの作業を何年も行ってきました。これにより、データベースを使用する作業の一部が軽減されます。

アプリでは、複数の列を持つテーブルがある場合があります。テーブルからデータを読み取るときは、SQL を実行してから、カーソルを使用してデータにアクセスします。

カーソルにはデータにアクセスするためのメソッドがいくつかあります。1 つはテーブルの列インデックスを使用します。ネットで見た例の多くはこれを使用しています。例えば:

cursor.getString(3);

コードに「3」を埋め込むことは最善のアイデアではないため、次を使用できます。

int idx = cursor.getColumnIndex( "THECOLUMNNAME" );
cursor.getString(idx);

テーブルと列に対して getColumnIndex() を複数回使用するのは無駄です。数十または数百の列のインデックスの定数を保持すると、エラーが発生しやすくなります。

私の質問は、この種のことを行うためのベストプラクティスは何ですか?

特定のテーブルをより適切に表すために Cursor を拡張する必要がありますか?

ありがとう、

マイク

4

2 に答える 2

3

列が非常に少ない場合、特にそれらの列に適切な名前 ( などSELECT MAX(x), MIN(x) FROM t) がない場合は、固定列インデックスを使用してもまったく問題ありません。これは、列の数/順序が後で変更される可能性が高い場合、またはソース コードでクエリとカーソル アクセスの間に大きな距離がある場合に、より危険です。

あまりにも多くの呼び出しを避けたい場合getColumnIndexは、実際に戻り値をキャッシュする必要があります。次のように、列インデックスとカーソルへの参照の両方を含むラッパー クラスを使用すると、これを簡単に行うことができます。

Cursor cursor = db.query(...);
Field foo = new Field(cursor, "FOO");
Field bar = new Field(cursor, "BAR");
while (cursor.moveToNext()) {
    foo.getString();
    bar.getInteger();
}

(このクラスの実装は課題として残しています...)

于 2013-07-01T16:55:43.170 に答える
1

Cursor の少なくとも一部の実装では、getColumnIndex は列名の配列を反復処理します ( 1 つの例については、こちらを参照してください)。クエリに多数の列を含むテーブルが含まれる場合は、列インデックスをキャッシュしてからループすることをお勧めします。結果の行。

しかし、コメントで他の人が指摘したように、多数の列はデータベース設計が不十分な兆候である可能性があります。

于 2013-07-01T16:09:50.170 に答える