4

我想有一個ContentProvider的,但我有麻煩了,因爲我得到的「無法找到com.example.alex.hopefulyworks供應商信息」無法找到提供信息的錯誤

這裏是一個錯誤清單和ContentProvider的

<?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; 
    } 





} 

回答

12

authorities需要有這隻包的名稱,name是完整的包和類名。

<provider android:name="com.example.alex.hopefulythisworks.ColorContentProvider" 
     android:authorities="com.example.alex.hopefulythisworks" 
     android:enabled="true" 
     android:exported="true" > 
    </provider> 

請記住,這需要符合您使用構建開放的一樣:

private static final String AUTHORITY = "com.example.alex.hopefulythisworks"; 

Android docs

3
android:authorities="com.example.alex.hopefulythisworks.ColorContentProvider" 

應該是一樣的

private static final String AUTHORITY 
     = "com.example.alex.hopefulythisworks"; 

so another s olution是取代AUTHORITY

希望它能幫助。

1

只要確保你在manifest文件中聲明類似下面提供商使用完全合格的名稱爲您searchableauthority還有:

<?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

1
<provider 
android:name="com.example.absolutelysaurabh.todoapp.ColorContentProvider" 
    android:authorities="com.example.absolutelysaurabh.todoapp 
    android:enabled="true" 
    android:exported="false" > 
</provider> 

重要:確保在「合同」類u've也用同樣的權威在這裏使用,即「com.example.absol utelysaurabh.todoapp「

+0

歡迎來到SO。請閱讀此[如何回答](http://stackoverflow.com/help/how-to-answer)以提供高質量的答案。沒有新信息,您的回覆似乎重複了一個被接受的答案 – thewaywewere

相關問題