2016-02-18 2 views
-1

Я пытаюсь собрать простое приложение, чтобы помочь мне понять поставщика контента, но я не могу заставить его работать. Я хочу вставить данные в базу данных, но я думаю, что проблема у меня есть где-то с URI.Не удается заставить Android ContentProvider работать

** Я пытаюсь следовать аналогичной схеме, как показано на учебники Udacity

Вот что у меня есть Android Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.simplecontentprovider"> 

    <provider 
     android:authorities="com.example.android.simplecontentprovider.app" 
     android:name=".data.MyContentProvider" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

ContentProvider:

public class MyContentProvider extends ContentProvider { 

    MyDatabaseHelper mOpenHelper; 

    private static final int NAME = 1; 

    // Creates a UriMatcher object. 
    private static final UriMatcher sUriMatcher = buildUriMatcher(); 

    static UriMatcher buildUriMatcher() { 

     final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 
     final String authority = MyDataContract.CONTENT_AUTHORITY; // Value = com.example.android.simplecontentprovider.app 

     matcher.addURI(authority, MyDataContract.PATH_TABLE, NAME); //PATH_TABLE = tblUserData 
     //matcher.addURI(authority, MyDataContract.PATH_TABLE + "/*", NAME); 

     return matcher; 
    } 

    @Override 
    public boolean onCreate() { 
     mOpenHelper = new MyDatabaseHelper(getContext()); 
     return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) { 
     return null; 
    } 

    @Override 
    public String getType(Uri uri) { 

     int match = sUriMatcher.match(uri); 
     switch (match){ 
      case NAME: 
       return MyDataContract.UserDetailsEntry.CONTENT_TYPE; 
      default: 
       throw new UnsupportedOperationException("UNKNOWN URI: " + uri); 
     } 

    } 

    @Override 
    public Uri insert(Uri uri, ContentValues contentValues) { 
     final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 
     final int match = sUriMatcher.match(uri); 
     Uri returnUri; 

     switch (match) { 
      case NAME: { 
       long _id = db.insert(MyDataContract.UserDetailsEntry.TABLE_NAME, null, contentValues); 
       if (_id > 0) 
        returnUri = MyDataContract.UserDetailsEntry.buildtblUserDetailsUri(_id); 
       else 
        throw new android.database.SQLException("Failed to insert row into " + uri); 
       break; 
      } 
      default: 
       throw new UnsupportedOperationException("Unknown uri: " + uri); 
     } 
     getContext().getContentResolver().notifyChange(uri, null); 
     return returnUri; 
    } 

    @Override 
    public int delete(Uri uri, String s, String[] strings) { 
     return 0; 
    } 

    @Override 
    public int update(Uri uri, ContentValues contentValues, String s, String[] strings) { 
     return 0; 
    } 
} 

и наконец, MainActivity

ContentResolver resolver = getContentResolver(); 

    Uri uri = MyDataContract.UserDetailsEntry.buildtblUserDetailsAll("MyTestName"); 

    Log.e("RESOLVER URI: ", uri.toString()); 

    ContentValues values = new ContentValues(); 
    values.put(MyDataContract.UserDetailsEntry.COLUMN_NAME, "MyTestName"); 

    try { 
     resolver.insert(uri, values); 
    }catch (Exception e){ 
     Log.e("RESOLVER INSERT: ", e.toString()); 
    } 

Когда я запускаю его через отладчик, я получаю сообщение:

java.lang.IllegalArgumentException: Unknown URL content://com.example.android.simplecontentprovider.app/tblUserData/MyTestName 

это значение по умолчанию для вставки в контент-провайдера. Я не уверен, если я пропускаю часть

+1

власти, я думаю, вы должны поместить ваш внутри. – Dave

+0

Спасибо Дэйв, двигаясь внутри работал. – Rohan000

+0

Рад, что я мог помочь :) – Dave

ответ

0
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.simplecontentprovider"> 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <provider 
      android:authorities="com.example.android.simplecontentprovider.app" 
      android:name=".data.MyContentProvider" /> 
    </application> 

</manifest> 
Смежные вопросы