アプリケーション A でカスタム コンテンツ プロバイダを作成し、別のアプリケーション B が A のこのコンテンツ プロバイダにアクセスするようにしました。以下は私のコード スニペットです。
アプリケーション A のコンテンツ プロバイダ:
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int table = um.match(uri);
SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();;
// configure where to query from
if (table == MYKEYS || table == MYKEY_ID) {
sqlBuilder.setTables(DATABASE_TABLE_MY);
if (table == MYKEY_ID)
sqlBuilder.appendWhere(
_ID + " = " + uri.getPathSegments().get(1));
}
else if (table == FDKEYS || table == FDKEY_ID) {
sqlBuilder.setTables(DATABASE_TABLE_FD);
if (table == FDKEY_ID)
sqlBuilder.appendWhere(
_ID + " = " + uri.getPathSegments().get(1));
}
else
throw new IllegalArgumentException("Unknown URI: " + uri);
if (sortOrder==null || sortOrder=="")
sortOrder = DEFAULT_SORT_ORDER;
// query
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor c = sqlBuilder.query(
db,
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
//register to watch a content URI for changes
c.setNotificationUri(getContext().getContentResolv er(), uri);
return c;
}
これは、アプリケーション A マニフェスト ファイルでコンテンツ プロバイダーを宣言する方法です。
<provider android:name=".KeysProvider"
android:authorities="com.android.keychain.keysprovider"/>
これは、アプリケーション B でクエリを作成する方法です。
String[] whereArgs = new String[]{"Private Key"};
Cursor c = managedQuery(MYTABLE_URI, null, "name", whereArgs, null);
アプリケーション B のコードを実行すると、次のエラーが発生します。
07-02 12:53:58.153: エラー/DatabaseUtils(9195): android.database.sqlite.SQLiteException: 範囲外のバインドまたは列インデックス: ハンドル 0x126558
ここで何が問題なのか本当にわかりません。アプリケーション A 内からこの同じコンテンツ プロバイダーにアクセスしようとすると、正常に動作します。また、ログを見ると、アプリケーション B (managedQuery 行) から、アプリケーション A (KeysProvider) でこのコンテンツ プロバイダーにアクセスできるようです。 )しかし、クエリを作成しようとすると死にます(行:カーソル c = sqlBuilder.query ... )。ここで何が問題なのか知っている人はいますか?
よろしくお願いします