Я пытаюсь собрать простое приложение, чтобы помочь мне понять поставщика контента, но я не могу заставить его работать. Я хочу вставить данные в базу данных, но я думаю, что проблема у меня есть где-то с 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
это значение по умолчанию для вставки в контент-провайдера. Я не уверен, если я пропускаю часть
власти, я думаю, вы должны поместить ваш внутри. –
Dave
Спасибо Дэйв, двигаясь внутри работал. –
Rohan000
Рад, что я мог помочь :) – Dave