抛出:IllegalArgumentException:未知的URL内容://内容 [英] IllegalArgumentException: Unknown URL content:// CONTENT
问题描述
抛出:IllegalArgumentException:未知的URL内容://
^经与上述的噩梦。我检查了我的变量和路径,但不能看到的问题是什么呢?大大AP preciate任何指针!
下面是我的痕迹。
java.lang.IllegalArgumentException异常:未知网址
内容://com.purewowstudio.topmovies.data.FilmProvider/film_data
在android.content.ContentResolver.insert(ContentResolver.java:1203)
在com.purewowstudio.topmovies.data.DatabaseHelper.addFilm(DatabaseHelper.java:52)
在com.purewowstudio.topmovies.fragments.FilmList $ getFilms.onPostExecute(FilmList.java:72)
在com.purewowstudio.topmovies.fragments.FilmList $ getFilms.onPostExecute(FilmList.java:62)
在android.os.AsyncTask.finish(AsyncTask.java:632)
在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:645)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:135)
在android.app.ActivityThread.main(ActivityThread.java:5262)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:898)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
内容提供商
公共类FilmProvider扩展ContentProvider的{
公共静态最后弦乐TABLE_NAME =film_data;
公共静态最后弦乐管理局=com.purewowstudio.topmovies.data.FilmProvider;
公共静态最终乌里CONTENT_URI = Uri.parse(内容://+ AUTHORITY +/+ TABLE_NAME);
公共静态最终诠释膜= 1;
公共静态最终诠释FILMS_ID = 2;
公共静态最终UriMatcher sURIMatcher =
新UriMatcher(UriMatcher.NO_MATCH);
静态{
sURIMatcher.addURI(权威,TABLE_NAME,电影);
sURIMatcher.addURI(权威,TABLE_NAME +/#,
FILMS_ID);
}
私人DatabaseHelper MDB;
公共布尔的onCreate(){
MDB =新DatabaseHelper(的getContext(),NULL,NULL,1);
返回false;
}
@覆盖
公共字符串的getType(URI URI){
返回null;
}
@覆盖
公共光标查询(URI URI,字符串[]投影,选择字符串,字符串[] selectionArgs两个,串排序顺序){
SQLiteQueryBuilder QueryBuilder的=新SQLiteQueryBuilder();
queryBuilder.setTables(MovieDataContract.TABLE_NAME);
INT uriType = sURIMatcher.match(URI);
开关(uriType){
案例FILMS_ID:
queryBuilder.appendWhere(MovieDataContract.FilmEntry._ID +=
+ uri.getLastPathSegment());
打破;
案例片:
打破;
默认:
抛出新抛出:IllegalArgumentException(未知URI);
}
光标光标= queryBuilder.query(mDB.getReadableDatabase()
投影,选择,selectionArgs两个,空,空,
排序);
cursor.setNotificationUri(的getContext()。getContentResolver(),
URI);
返回游标;
}
@覆盖
公众开放的插入(URI URI,ContentValues值){
INT uriType = sURIMatcher.match(URI);
SQLiteDatabase SQLDB = mDB.getWritableDatabase();
长ID = 0;
开关(uriType){
案例片:
ID = sqlDB.insert(MovieDataContract.TABLE_NAME,
空,价值观);
打破;
默认:
抛出新抛出:IllegalArgumentException(未知URI
+ URI);
}
的getContext()getContentResolver()有NotifyChange(URI,空)。
返回Uri.parse(MovieDataContract.TABLE_NAME +/+ ID);
}
DatabaseHelper类
公共类DatabaseHelper扩展SQLiteOpenHelper {
私人ContentResolver的myCR;
公共DatabaseHelper(上下文的背景下,字符串名称,
SQLiteDatabase.CursorFactory工厂,INT版){
超(背景下,MovieDataContract.DATABASE_NAME,工厂,MovieDataContract.DATABASE_VERSION);
myCR = context.getContentResolver();
}
@覆盖
公共无效的onCreate(SQLiteDatabase DB){
db.execSQL(MovieDataContract.FilmEntry.SQL_CREATE_TABLE);
}
@覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
db.execSQL(MovieDataContract.FilmEntry.DELETE_TABLE);
的onCreate(DB);
}
公共无效addFilm(电影胶片){
SQLiteDatabase DB = this.getWritableDatabase();
ContentValues值=新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,价值观);
db.insert(MovieDataContract.TABLE_NAME,
空值,
值);
db.close();
}
清单
< XML版本=1.0编码=UTF-8&GT?;
<使用-权限的Android:名称=android.permission.INTERNET对/>
<应用
机器人:allowBackup =真
机器人:图标=@纹理映射/ ic_launcher
机器人:标签=@字符串/ APP_NAME
机器人:主题=@风格/ TopMoviesTheme>
<活动
机器人:名称=。MainActivity
机器人:标签=@字符串/ APP_NAME>
<意向滤光器>
<作用机器人:名称=android.intent.action.MAIN/>
<类机器人:名称=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
< /活性GT;
<活动
机器人:名称=。DetailFragment
机器人:标签=@字符串/ title_activity_detail_fragment
机器人:parentActivityName =MainActivity。>
&所述;元数据
机器人:名称=android.support.PARENT_ACTIVITY
机器人:值=com.purewowstudio.topmovies.MainActivity/>
<供应商
机器人:名称=。data.filmProvider
机器人:当局=com.purewowstudio.topmovies.data.filmProvider
机器人:出口=真正的>
< /供应商>
< /活性GT;
< /用途>
< /舱单>
首先,移动<供应商>
成为℃的子女;用途>
,不是<活性GT;
二,变更安卓出口=真正的
到安卓出口=假
,直至时间,因为你保护你的的ContentProvider
。既然这样,一旦你确定了<供应商>
如上所述元素位置,任何应用程序都可以读取和您的供应商,这是不可能写什么是什么用户想要的。
IllegalArgumentException: Unknown URL content://
^ Having a nightmare with the above. I've checked my variables and paths but can't see what the issue is? Greatly appreciate any pointers!
Here's my trace.
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)
Content Provider
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 Class
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();
}
Manifest
<?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>
First, move <provider>
to be a child of <application>
, not <activity>
.
Second, change android:exported="true"
to android:exported="false"
, until such time as you secure your ContentProvider
. As it stands, once you fix the <provider>
element location as noted above, any app can read and write anything in your provider, which is unlikely to be what the user wants.
这篇关于抛出:IllegalArgumentException:未知的URL内容://内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!