【问题标题】:IllegalArgumentException: Unknown URL content:// CONTENTIllegalArgumentException:未知的 URL 内容:// CONTENT
【发布时间】:2015-03-20 20:58:00
【问题描述】:

IllegalArgumentException:未知的 URL 内容://

^ 对上述内容做了噩梦。我检查了我的变量和路径,但看不出问题出在哪里?非常感谢任何指针!

这是我的踪迹。

 java.lang.IllegalArgumentException: Unknown URL     
 content://com.purewowstudio.topmovies.data.FilmProvider/film_data
        at android.content.ContentResolver.insert(ContentResolver.java:1203)
        at com.purewowstudio.topmovies.data.DatabaseHelper.addFilm(DatabaseHelper.java:52)
        at com.purewowstudio.topmovies.fragments.FilmList$getFilms.onPostExecute(FilmList.java:72)
        at com.purewowstudio.topmovies.fragments.FilmList$getFilms.onPostExecute(FilmList.java:62)
        at android.os.AsyncTask.finish(AsyncTask.java:632)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5262)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

内容提供者

public class FilmProvider extends ContentProvider {

public static final String TABLE_NAME = "film_data";
public static final String AUTHORITY =  "com.purewowstudio.topmovies.data.FilmProvider";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);

public static final int FILMS = 1;
public static final int FILMS_ID = 2;

public static final UriMatcher sURIMatcher =
        new UriMatcher(UriMatcher.NO_MATCH);

static {
    sURIMatcher.addURI(AUTHORITY, TABLE_NAME, FILMS);
    sURIMatcher.addURI(AUTHORITY, TABLE_NAME + "/#",
            FILMS_ID);
}

private DatabaseHelper mDB;

public boolean onCreate() {
    mDB = new DatabaseHelper(getContext(), null, null, 1);
    return false;
}

@Override
public String getType(Uri uri) {
    return null;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[]        selectionArgs, String sortOrder) {

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(MovieDataContract.TABLE_NAME);
    int uriType = sURIMatcher.match(uri);

    switch (uriType) {
        case FILMS_ID:
            queryBuilder.appendWhere(MovieDataContract.FilmEntry._ID + "="
                    + uri.getLastPathSegment());
            break;
        case FILMS:
            break;
        default:
            throw new IllegalArgumentException("Unknown URI");
    }

    Cursor cursor = queryBuilder.query(mDB.getReadableDatabase(),
            projection, selection, selectionArgs, null, null,
            sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(),
            uri);
    return cursor;

}

@Override
public Uri insert(Uri uri, ContentValues values) {

    int uriType = sURIMatcher.match(uri);

    SQLiteDatabase sqlDB = mDB.getWritableDatabase();

    long id = 0;
    switch (uriType) {
        case FILMS:
            id = sqlDB.insert(MovieDataContract.TABLE_NAME,
                    null, values);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI: "
                    + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return Uri.parse(MovieDataContract.TABLE_NAME + "/" + id);
}

DatabaseHelper 类

 public class DatabaseHelper extends SQLiteOpenHelper {

private ContentResolver myCR;

public DatabaseHelper(Context context, String name,
                      SQLiteDatabase.CursorFactory factory, int version) {
    super(context, MovieDataContract.DATABASE_NAME, factory, MovieDataContract.DATABASE_VERSION);

    myCR = context.getContentResolver();
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(MovieDataContract.FilmEntry.SQL_CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(MovieDataContract.FilmEntry.DELETE_TABLE);
    onCreate(db);
}

public void addFilm(Film film){

    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_TITLE, film.getTitle());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_RATING,  film.getRating());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_RUNTIME,  film.getRuntime());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_CRITICS,  film.getCritics());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_AUDIENCE,  film.getAudience());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_SYNOPSIS,  film.getSynopsis());
    values.put(MovieDataContract.FilmEntry.COLUMN_FILM_PROFILE,  film.getProfile());

    myCR.insert(FilmProvider.CONTENT_URI, values);

    db.insert(MovieDataContract.TABLE_NAME,
            null,
            values);
    db.close();
}

清单

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/TopMoviesTheme" >
    <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>
    <activity
        android:name=".DetailFragment"
        android:label="@string/title_activity_detail_fragment"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.purewowstudio.topmovies.MainActivity" />
        <provider
            android:name=".data.filmProvider"
            android:authorities="com.purewowstudio.topmovies.data.filmProvider"
            android:exported="true">
        </provider>
    </activity>
</application>

</manifest>

【问题讨论】:

  • 能否请您提供如何调用insert 方法的代码?另外,您将&lt;provider /&gt; 标签放在&lt;activity /&gt; 标签内,这也可能是问题所在。
  • 好的,所以我已将提供程序移到活动之外。同样的问题?插入在 DBHelper 中
  • 附带说明:为什么您的onCreate 方法返回false?还有一个可能的错误:在addFilm 方法中,您在 ContentProvider 和数据库中插入数据,这会导致无用的数据重复。
  • 谢谢。看起来它现在正在工作。我很感激帮助。还没有代表投票。谢谢

标签: java android android-activity android-contentprovider android-database


【解决方案1】:

首先,将&lt;provider&gt; 移动为&lt;application&gt; 的子级,而不是&lt;activity&gt;

其次,将android:exported="true" 更改为android:exported="false",直到您保护ContentProvider。就目前而言,一旦您如上所述修复了 &lt;provider&gt; 元素位置,任何应用程序都可以在您的提供程序中读取和写入任何内容,这不太可能是用户想要的。

【讨论】:

  • 作者调用insert方法的URI不正确,根本解决不了问题。
  • @Arkadiy:好点——我错过了。 @PhilWiggins:您的权限字符串中至少有一个错字——Ff 在权限的filmProvider 部分中。
  • 非常感谢您的帮助。全部排序!!
  • 我在&lt;application&gt; 之外添加了&lt;provider&gt;。谢谢你帮助我。
【解决方案2】:

我在权限中添加了包名称。这就是我遇到此问题的原因。我必须在authorities 中添加Provider name

  <provider
            android:name="LoginContentProvider"
            android:authorities="com.provider.name.team"
            android:exported="false" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多