2011-01-29 4 views
0

私はカーソルを使用していないPHPの背景です。Androidでプログラミングする場合、カーソルをSQLiteから単純な読み取り専用値を取得する必要がありますか?

Google Androidノートパッドの例では、カーソルとデータベースアダプタを使って練習しています。カーソルのポイントが「Androidで発生するライフサイクルのアクティビティを支援する」、またはその例を引用していることをぼんやりと理解しています。「Androidがカーソルのライフサイクルを気にする必要がなく、世話をすることができる」 。

私の質問は、読み込み専用の値を取得するような簡単なことをしているのですが、それでもカーソルを使用するのが一番良いですか?おそらくデータを取得する他のより良い(より速い)方法がありますか?この特定のクエリでは、カーソルを使用するとオーバーヘッドが増えるようです。

以下のコードのポイントは、カート内のアイテムの数を取得することです。

public long getNumItemsInCart(Long rowId) throws SQLException { 
     Cursor mCursor = 
      mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NUM_ITEMS_IN_CART}, KEY_ROWID + "='" + rowId + "'", null, 
        null, null, null, null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor.getLong(mCursor.getColumnIndexOrThrow(ProductsDbAdapter.KEY_NUM_ITEMS_IN_CART));   
    } 

答えて

0

データベースから単純な値を得る他の優れた(より速い)方法がわかりません。

データベース(ContentProvider)とアプリケーションロジックの間に独自のコードレイヤーを配置して、このような操作を行うための独自の便利なメソッドを作成できます。しかし、あなたが確かに知っているように、余分なレイヤーは、正しく書かれていないとパフォーマンスのペナルティを引き起こすかもしれません。

また、単純な値をキャッシュすることもできます(初期化中に一度読んで、クラスの適切なメンバフィールドに保存します)。しかし、これはあなたのライフサイクルを制御していないことを意味します。 LongまたはIntegerの値に対して直接「再クエリ」を呼び出すことはできません(Long.requery()などはありません)。

したがって、単一の値に対するCursorオブジェクト全体を使用すると、いくつかのユースケースでは過度に思えるかもしれませんが、データベースから単一の値(1列、1行)を取得するのが最も一般的な使用例ではありません。そのような値の場合は、おそらくSharedPreferencesインフラストラクチャを使用します。ほとんどの場合、データベースから複数の列と複数の行が取得されます。その観点から、Cursorオブジェクトは非常に便利です。

+0

ありがとうございました。 –

+0

ようこそ。あなたがそれが有用であることを願っています:-) – dbm

関連する問題