9

HereSimpleCursorAdapterのAPIレベル1コンストラクタは推奨されておらず、LoaderManagerCursorLoaderの使用をお勧めします。SimpleCursorAdapterの古いコンストラクタは廃止されました..本当に?

しかしLoaderManagerCursorLoaderの使用掘り下げる私はListFragment(私は仮定断片自体の拡張)を拡張する内部クラスの内部で、我々はCursorLoaderを作成this例を見つけました。 CursorLoaderUriを引数に取っていることを除いて、すべてが問題なく表示されます。したがって、これは私のデータベースにアクセスするためにContentProviderを作成する必要があることを意味します。

私はそれだけでデータベースからのアイテムでシンプルなListViewを作成するには、このすべてを通過する必要がやり過ぎのように見える告白しなければなりません。特に私が自分のデータベースのデータを他のアプリで利用できるようにするつもりがなければ、コンテンツプロバイダの主な目的はそれを行うことです。

だから本当に価値がありますか?

特に、フェッチされるコンテンツが小さくなる可能性が高い鉱山のような場合。私は真剣に古いことをやろうと考えています、何を言っていますか?

+1

あなたが唯一のAPI 11以降をサポートしていますか? – Cristian

+0

もちろん、私はそうではありません。以前のリリースでは、フラグメントとローダーのサポートを提供する互換性ライブラリを使用していました。 – Bilthon

+0

あなたが見つけたサンプルの名前は何ですか(私のアプリでやりたいことのようです)?リンクは単にサンプルを説明しているだけです。 – Karl

答えて

8

私は、コンテンツプロバイダを必要としないsimple CursorLoaderを書いた:

import android.content.Context; 
import android.database.Cursor; 
import android.support.v4.content.AsyncTaskLoader; 

/** 
* Used to write apps that run on platforms prior to Android 3.0. When running 
* on Android 3.0 or above, this implementation is still used; it does not try 
* to switch to the framework's implementation. See the framework SDK 
* documentation for a class overview. 
* 
* This was based on the CursorLoader class 
*/ 
public abstract class SimpleCursorLoader extends AsyncTaskLoader<Cursor> { 
    private Cursor mCursor; 

    public SimpleCursorLoader(Context context) { 
     super(context); 
    } 

    /* Runs on a worker thread */ 
    @Override 
    public abstract Cursor loadInBackground(); 

    /* Runs on the UI thread */ 
    @Override 
    public void deliverResult(Cursor cursor) { 
     if (isReset()) { 
      // An async query came in while the loader is stopped 
      if (cursor != null) { 
       cursor.close(); 
      } 
      return; 
     } 
     Cursor oldCursor = mCursor; 
     mCursor = cursor; 

     if (isStarted()) { 
      super.deliverResult(cursor); 
     } 

     if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { 
      oldCursor.close(); 
     } 
    } 

    /** 
    * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks 
    * will be called on the UI thread. If a previous load has been completed and is still valid 
    * the result may be passed to the callbacks immediately. 
    * <p/> 
    * Must be called from the UI thread 
    */ 
    @Override 
    protected void onStartLoading() { 
     if (mCursor != null) { 
      deliverResult(mCursor); 
     } 
     if (takeContentChanged() || mCursor == null) { 
      forceLoad(); 
     } 
    } 

    /** 
    * Must be called from the UI thread 
    */ 
    @Override 
    protected void onStopLoading() { 
     // Attempt to cancel the current load task if possible. 
     cancelLoad(); 
    } 

    @Override 
    public void onCanceled(Cursor cursor) { 
     if (cursor != null && !cursor.isClosed()) { 
      cursor.close(); 
     } 
    } 

    @Override 
    protected void onReset() { 
     super.onReset(); 

     // Ensure the loader is stopped 
     onStopLoading(); 

     if (mCursor != null && !mCursor.isClosed()) { 
      mCursor.close(); 
     } 
     mCursor = null; 
    } 
} 

それだけAsyncTaskLoaderクラスを必要とします。 Android 3のいずれか。0以上、または互換性パッケージに付属のものです。

+0

ありがとうalot @Cristian – confucius

+0

SimpleCursorLoaderのための素敵なコードサンプルが見つかりました - https://bitbucket.org/ssutee/418496_mobileapp/src/fc5ee705a2fd/demo/DotDotListDB/src/th/ac/ku/android/sutee/dotdotlist - foundそれは非常に便利です! – Shushu

4

フラグをとるコンストラクタを使用してください。 FLAG_AUTO_REQUERYは使用しないでください。フラグに0を渡すだけです。

ユーザーがListViewを見ている間に、基礎となるDBへのデータ変更を本当に処理する必要がない限り、クエリを再実行する必要はありません。

一方、ユーザーがリストを見ている間にリストビューにDBの変更を表示したい場合は、Googleのアドバイスに従い、CursorLoaderを使用します。

EDIT:

二コンストラクタはAPIあなた自身CursorAdapter拡張するだけでも11でのみ利用可能ですので。 bindViewとnewViewを実装するだけで済みます。

1

推奨されないコンストラクタsimpleCursorAdapterを使用してください。この種のエラーは、 私のアプリケーションを開発していたときに表示されましたが、私はそれを使いました。または、余分な引数、つまりフラグ引数を持つアンドロイドデベロッパーのWebサイトで廃止予定のコンストラクタを使用してみてください。

+0

2番目のコンストラクタはAPIレベル11で導入されていることに注意してください。それでは、互換ライブラリを追加して使用する必要があります。静的ライブラリを追加すると、最終的に私のapkが大きくなります。もしそれがちょうどそのコンストラクタを使うためのものなら、正直なところ、私はそのポイントを見ません。 – Bilthon

1

私はCursorLoaderが現在ContentProviderでの使用を意図していると信じています。

新しいフレームワークを使用してデータベースから直接ロードする場合は、 AsyncTaskLoaderを拡張し、CursorLoaderを使用する代わりにonCreateLoaderからそれを戻すことを検討できます。

既存のメソッドを使用している場合は、クエリ操作の所要時間をさらに注意する必要があります。クエリに目立つ時間がかかる場合は、AsyncTaskを使用してカーソルをロードすることを検討してください(UIスレッドで実行されているクエリーに注意してください)。

0

このスレッドは古いですが、最後のパラメータをSimpleCursorAdapterオブジェクトの作成に追加することができます。単に "、0"を追加してください。

Androidが好きで警告が消える旗です。

例:

SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.item_list_layout, cursor, fromDB(), toLayout(), 0); 
関連する問題