2012-02-20 20 views
3

Androidアプリケーションを、LoaderManagerとCursorLoaderを使用するように変換しようとしています。基本的には、ADDRESS列とDISTANCE列を含むSQLiteデータベースがあり、列値をListView行にロードしたいとします。 http://mobile.tutsplus.com/tutorials/android/android-sdk_content-providers/Android LoaderManagerとCursorLoaderの混乱

それは素敵なチュートリアルだが、私はまだ理解していない、物事のカップルがあります:

今、私はこのチュートリアルに多くの研究、およびすべてのポイントを行っています。主に、 'new CursorLoader()'に渡されるコンテンツURIをどのように構築するのですか?デバイスの連絡先などの外部データは使用していません。

下記のコードをご覧ください。私はBASE_URIの値を生成する方法へと混乱しています:

public class FavoritesFragment extends ListFragment implements 
    LoaderManager.LoaderCallbacks<Cursor> { 

SimpleCursorAdapter mAdapter; 

static final String[] FAVORITES_SUMMARY_PROJECTION = new String[] { 
     MyApplication.COLUMN_ID, MyApplication.COLUMN_ADDRESS, 
     MyApplication.COLUMN_DISTANCE, }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mAdapter = new SimpleCursorAdapter(getActivity(), 
      R.layout.locations_list_row, null, new String[] { 
        MyApplication.COLUMN_ADDRESS, 
        MyApplication.COLUMN_DISTANCE }, new int[] { 
        R.id.address2, R.id.distance }, 0); 
    setListAdapter(mAdapter); 

    getLoaderManager().initLoader(0, null, this); 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    // Insert desired behavior here. 
} 

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(getActivity(), ***BASE_URI***, 
      FAVORITES_SUMMARY_PROJECTION, null, null, null); 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
} 

public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.swapCursor(null); 
} 

} 
+0

[** LoaderManager(パート2)**](http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html)を理解することは、学ぶべき素晴らしい投稿です。 –

答えて

7

BASE_URIはどんなContentProviderに/クエリ/更新/挿入を行うときようにそれが使用されている、あなたのContentProviderで定義されたstatic Uriする必要があり、 ContentProviderにも定義されているは、Switchステートメント(このチュートリアルのquery()メソッドの例のように)を使用してデータベース内の正しいテーブルに正しいクエリを設定できるようにIntegerを出力できます。データベース内のテーブルごとに異なるBASE_URIを定義する必要があります。

あなたは、彼らがContentProviderで単一Uriを定義したそのチュートリアルを見れば:あなたのContentProviderで

private static final String TUTORIALS_BASE_PATH = "tutorials"; 
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY 
     + "/" + TUTORIALS_BASE_PATH); 

、あなたがあなたのテーブルの名前がそれに含まれているものは何でもに"tutorials"からTUTORIALS_BASE_PATHの値を変更する必要がありますあなたが言及したADDRESS列とDISTANCE列。あなたのCursorLoaderコンストラクタのコードは次のようになります。

return new CursorLoader(getActivity(), YourContentProvider.CONTENT_URI, 
      FAVORITES_SUMMARY_PROJECTION, null, null, null); 

完全にするために、あなたはより説明する変数名を変更する必要があり、そうではなくTUTORIALS_BASE_PATHCONTENT_URIよりも、あなたはLOCATIONS_BASE_PATHLOCATIONS_URIのようなものに変更する必要があります。

+0

あなたの説明は、私が探していた "大きな画像"の明確化を私に提供しました。ありがとう! – littleK