1

フラグメントとContentProviderを使用したアクティビティがあります。何らかの理由で、ContentProviderのクエリメソッドが呼び出されることはありません。これはEclipseデバッガーで確認しました。これが私の関連するフラグメントコードです:

public class ListFrag extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private SimpleCursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Intent myData = getActivity().getIntent();
    Bundle info = myData.getExtras();

    String[] dataColumns = { "stitchname" };
    int[] viewIDs = { R.id.stitchlist1 };
    mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.stitchlist, null, dataColumns, viewIDs, 0);
    setListAdapter(mAdapter);
    getLoaderManager().initLoader(0, info, (LoaderCallbacks<Cursor>) this); 

}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String selection = "stitchlevel=?";
    String[] selectionArgs = new String[] {args.getString("Level")};
    return (Loader<Cursor>) new CursorLoader(getActivity(), STITCHES_URI,
            PROJECTION, selection, selectionArgs, null);    
}

そして、これが関連するContentProviderクエリです。SQLDataは私のSQLiteDatabaseです:

public class StitchProvider extends ContentProvider {
private static final String STITCHTABLE_BASEPATH = "MyStitches_tbl";
public static final int STITCHES = 100;
public static final int STITCHES_ID = 110;
private SQLData mDB;
@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(STITCHTABLE_BASEPATH);
    int uriType = sURIMatcher.match(uri);
    switch (uriType)
    {
    case STITCHES_ID:
        queryBuilder.appendWhere(SQLData.KEY_ROWID + "=" + uri.getLastPathSegment());
        break;
    case STITCHES:
        //no filter
        break;
    default:
        throw new IllegalArgumentException("Unknown URI");
    }
    Cursor cursor = queryBuilder.query(mDB.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
}
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {    
    sURIMatcher.addURI(AUTHORITY, STITCHTABLE_BASEPATH, STITCHES);    
    sURIMatcher.addURI(AUTHORITY, STITCHTABLE_BASEPATH + "/#", STITCHES_ID);
    }
}

このクエリメソッドが呼び出されない理由について何かアイデアはありますか?ありがとう!

4

1 に答える 1

2

@nandeesh がコメントで述べたように、マニフェスト ファイルでプロバイダーを宣言することでこれを修正します。

次の形式である必要があります。

<manifest>
    ...
    <application>
        <activity>...</activity>

    ...
    <provider ... />

    </application>
</manifest>

プロジェクトで問題を再現できました。ただし、何らかの警告として検出されることを願っています。しかし、誰かが遭遇したクエリが呼び出されていない場合、私の場合、すべての ContentProvider インターフェイス メソッドが呼び出されたわけではありません。これは、マニフェスト ファイルでプロバイダーをまだ宣言していないためです。

これが将来他の人に役立つことを願っています。

于 2015-04-07T07:39:00.133 に答える