Content Provider Announcement

This is my first time I used a content provider, but I followed the developer's docs , but when I run the program, it tells me failed to find provider info

here is my manifest

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tyczj.bowling" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="Tabs"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="BowlersList"></activity> </application> <provider android:name="com.tyczj.bowling.BowlersDB" android:authorities="com.tyczj.bowling.bowlersdb"> </provider> </manifest> 

and my content provider

 public class BowlersDB extends ContentProvider { private static final String DATABASE_NAME = "Bowlers"; private static final String BOWLERS_TABLE = "bowlers_table"; private static final int DATABASE_VERSION = 1; public static final Uri CONTENT_URI = Uri.parse("content://com.tyczj.bowling.bowlersdb"); private static final UriMatcher uriMatcher; static final String NAME = "name"; static final String ID = "_id"; private DatabaseHelper DBHelper; private SQLiteDatabase db; public Cursor getBowlers(){ return db.query(BOWLERS_TABLE, new String[] {ID,NAME},null,null,null,null,NAME + " ASC"); } public Cursor getId(String name){ Cursor c = db.query(BOWLERS_TABLE, new String[] {ID,NAME},NAME + "='" + name +"'",null,null,null,null); if(c != null && c.moveToFirst()){ do{ if(c.getString(c.getColumnIndex(NAME)).equals(name)){ return c; } }while(c.moveToNext()); } return c; } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { createTables(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("CalendarDB", "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS Events_Table"); onCreate(db); } private void createTables(SQLiteDatabase db){ db.execSQL("CREATE TABLE " + BOWLERS_TABLE + "(" + ID + " integer primary key autoincrement, " + NAME + " TEXT);"); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; int num = uriMatcher.match(uri); if(num == 1){ count = db.delete(BOWLERS_TABLE, selection,selectionArgs); }else if(num == 2){ String id = uri.getPathSegments().get(1); count = db.delete(BOWLERS_TABLE, ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { if(uriMatcher.match(uri) == 1){ return "vnd.android.cursor.dir/vnd.tyczj.bowlersdb "; }else if(uriMatcher.match(uri) == 2){ return "vdn.android.cursor.item/vnd.tyczj.bowlersdb "; }else throw new IllegalArgumentException("Unsupported URI: " + uri); } @Override public Uri insert(Uri uri, ContentValues values) { long rowID = db.insert(BOWLERS_TABLE,null, values); if(rowID > 0){ Uri _uri = ContentUris.withAppendedId(CONTENT_URI,rowID); getContext().getContentResolver().notifyChange(_uri,null); return _uri; }else{ throw new SQLException("Failed to insert row into " + uri); } } @Override public boolean onCreate() { Context context = getContext(); DBHelper = new DatabaseHelper(context); db = DBHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder(); sqlBuilder.setTables(BOWLERS_TABLE); if(uriMatcher.match(uri) == 1){ sqlBuilder.appendWhere(ID + " = " + uri.getPathSegments().get(1)); } if(sortOrder == null || sortOrder == "") sortOrder = NAME; Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs,null,null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; int num = uriMatcher.match(uri); if(num == 1){ count = db.update(BOWLERS_TABLE, values, selection, selectionArgs); }else if(num == 2){ count = db.update(BOWLERS_TABLE, values, ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); }else{ throw new IllegalArgumentException( "Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.tyczj.bowling.bowlersdb","bowlers",1); uriMatcher.addURI("com.tyczj.bowling.bowlersdb","bowlers/#",2); } 

}

Not sure what I did wrong?

+4
source share
4 answers

The provider must be in the application tag.

  <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tyczj.bowling" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="Tabs"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="BowlersList"></activity> <provider android:name="com.tyczj.bowling.BowlersDB" android:authorities="com.tyczj.bowling.bowlersdb"> </provider> </application> </manifest> 
+12
source

You should not call db = DBHelper.getWritableDatabase(); in ContentProvider onCreate. This is explained in the SQLiteOpenHelper documentation for getReadableDatabase and getWritableDatabase :

Like getWritableDatabase, this method can take a lot of time, so you should not call it from the main application stream, including from ContentProvider.onCreate ().

Instead, keep a reference to the SQLiteOpenHelper instance and call getWritableDatabase / getReadableDatabase, as needed in the request / insert / delete / update methods, which are called asynchronously if you use Loaders.

Sorry, this is not directly aimed at the question, but this is what I saw throughout the code samples.

+2
source

you have this error because you are defining your provider outside of the application tag. therefore, please identify your provider inside the application.

 <application ........ <provider android:name="com.tyczj.bowling.BowlersDB" android:authorities="com.tyczj.bowling.bowlersdb"> </provider> </application> 
0
source

This is a good example of using the Android Manifest editor in Eclipse. It puts such elements / components in their syntactically correct location, so you do not need to worry about this issue. Another way to look at this: consider using the manifest editor at the beginning (& Occassionally) to validate your manifest.

0
source

Source: https://habr.com/ru/post/1383488/


All Articles