update studio qué proveedor getcontentresolver contentresolver content contenidos java android android-activity android-contentprovider android-database

java - studio - qué es un proveedor de contenidos



IllegalArgumentException: contenido de URL desconocido:// CONTENT (2)

IllegalArgumentException: contenido de URL desconocido: //

^ Tener una pesadilla con lo de arriba. Revisé mis variables y rutas pero no puedo ver cuál es el problema. ¡Aprecio mucho cualquier puntero!

Aquí está mi rastro.

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)

Proveedor de contenido

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

Clase de 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(); }

Manifiesto

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


Primero, mueva <provider> para que sea hijo de <application> , no de <activity> .

En segundo lugar, cambie android:exported="true" a android:exported="false" , hasta el momento en que ContentProvider su ContentProvider . Tal como está, una vez que arreglas la ubicación del elemento <provider> como se indicó anteriormente, cualquier aplicación puede leer y escribir cualquier cosa en tu proveedor, lo que es poco probable que sea lo que el usuario quiere.


He agregado el nombre del paquete en las autoridades. Por eso tengo este problema. Tengo que agregar el Provider name en las authorities .

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