コンテンツプロバイダーを作成しようとしていますが、「com.example.alex.hopefulyworksのプロバイダー情報が見つかりませんでした」というエラーが発生して問題が発生します
ここにマニフェストとコンテンツプロバイダーがあります
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.alex.hopefulythisworks" >
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name=".MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider Android:name=".ColorContentProvider"
Android:authorities="com.example.alex.hopefulythisworks.ColorContentProvider"
Android:enabled="true"
Android:exported="true" >
</provider>
</application>
</manifest>
package com.example.alex.hopefulythisworks;
....
public class ColorContentProvider extends ContentProvider {
private ColorHelper database;
private static final String AUTHORITY
= "com.example.alex.hopefulythisworks";
private static final String BASE_PATH
= "tasks";
public static final Uri CONTENT_URI
= Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
public static final String CONTENT_URI_PREFIX
= "content://" + AUTHORITY + "/" + BASE_PATH + "/";
private static final UriMatcher sURIMatcher =
new UriMatcher(UriMatcher.NO_MATCH);
private static final int COLOR = 1;
private static final int COLOR_ROW = 2;
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, COLOR);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", COLOR_ROW);
}
@Override
public boolean onCreate() {
database = new ColorHelper(getContext());
Log.d("contentprovider" , "inside content provider oncreate ");
return false;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int uriType = sURIMatcher.match(uri);
SQLiteDatabase sqlDB = database.getWritableDatabase();
long id = 0;
switch (uriType) {
case COLOR:
id = sqlDB.insert(ColorTable.TABLE_TASK,
null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI: "
+ uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse( CONTENT_URI_PREFIX + id);
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// check if the caller has requested a column which does not exists
ColorTable.validateProjection( projection );
// Using SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables( ColorTable.TABLE_TASK );
switch ( sURIMatcher.match(uri) ) {
case COLOR:
break;
case COLOR_ROW:
// add the task ID to the original query
queryBuilder.appendWhere( ColorTable.COLUMN_ID + "=" + uri.getLastPathSegment() );
break;
default:
throw new IllegalArgumentException("Invalid URI: " + uri);
}
System.out.println("before null check");
if(database == null){
System.out.println("database is null");
database = new ColorHelper(getContext());
}
System.out.println("after null check");
SQLiteDatabase db = database.getWritableDatabase();
Cursor cursor = queryBuilder.query( db, projection, selection,
selectionArgs, null, null, sortOrder);
// notify listeners
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase sqlDB = database.getWritableDatabase();
int rowsDeleted = 0;
switch ( sURIMatcher.match(uri) ) {
case COLOR:
rowsDeleted = sqlDB.delete(ColorTable.TABLE_TASK, selection, selectionArgs);
break;
case COLOR_ROW:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsDeleted = sqlDB.delete( ColorTable.TABLE_TASK,
ColorTable.COLUMN_ID + "=" + id,
null);
} else {
rowsDeleted = sqlDB.delete( ColorTable.TABLE_TASK,
ColorTable.COLUMN_ID + "=" + id
+ " and " + selection,
selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Invalid URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
}
@Override
public int update(Uri uri, ContentValues values, String selection , String[] selectionArgs) {
SQLiteDatabase sqlDB = database.getWritableDatabase();
int rowsUpdated = 0;
switch ( sURIMatcher.match(uri) ) {
case COLOR:
rowsUpdated = sqlDB.update( ColorTable.TABLE_TASK,
values,
selection,
selectionArgs);
break;
case COLOR_ROW:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsUpdated = sqlDB.update( ColorTable.TABLE_TASK,
values,
ColorTable .COLUMN_ID + "=" + id,
null );
} else {
rowsUpdated = sqlDB.update( ColorTable.TABLE_TASK,
values,
ColorTable.COLUMN_ID + "=" + id
+ " and " + selection,
selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Invalid URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
}
authorities
はパッケージ名のみを持つ必要があり、name
は完全なパッケージおよびクラス名です。
<provider Android:name="com.example.alex.hopefulythisworks.ColorContentProvider"
Android:authorities="com.example.alex.hopefulythisworks"
Android:enabled="true"
Android:exported="true" >
</provider>
これは、Uriの構築に使用しているものと一致する必要があることに注意してください。
private static final String AUTHORITY = "com.example.alex.hopefulythisworks";
Android:authorities="com.example.alex.hopefulythisworks.ColorContentProvider"
同じである必要があります
private static final String AUTHORITY
= "com.example.alex.hopefulythisworks";
別の解決策はAUTHORITY
を
private static final String AUTHORITY
= "com.example.alex.hopefulythisworks.ColorContentProvider";
それが役に立てば幸い。
authority
でsearchable
として完全修飾名を使用していること、および以下のようにマニフェストファイルで宣言されているプロバイダーで使用していることを確認してください。
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:hint="@string/action_search"
Android:label="@string/app_name"
Android:searchSuggestAuthority="your_pakcage_name.SearchSuggestionProvider"
Android:searchSuggestSelection=" ?" />
<provider
Android:authorities="your_pakcage_name.SearchSuggestionProvider"
Android:name="your_pakcage_name.SearchSuggestionProvider"
Android:exported="true"
Android:enabled="true"
Android:multiprocess="true"/>
プロバイダーに機密情報がある場合は、エクスポートされたものがtrue
ではないことを確認してください
<provider
Android:name="com.example.absolutelysaurabh.todoapp.ColorContentProvider"
Android:authorities="com.example.absolutelysaurabh.todoapp
Android:enabled="true"
Android:exported="false" >
</provider>
[〜#〜]重要[〜#〜]:「契約」クラスで、ここで使用されているものと同じ権限、つまり「com.example.absolutelysaurabh.todoapp」も使用していることを確認してください