本文主要是介绍ContentProvider解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.ContentProvider是什么:
四大组件之一用于共享数据。多个进程间共享数据,可以通过共享文件的方法,而共享文件的话,权限自己怎么控制呢?ContentProvider让开发者能够在拥有读写权限的情况下通过一条地址(比如content://com.fool/tab1)来访问共享数据。
2.应用场景 android 中许多系统软件和应用软件都使用该方式实现数据共享,比如电话本,相片,音乐,短彩信,日程表信息等
3.ContentProvider使用代码
AndroidManifest.xml中
<!--android:authorities 唯一标识,通过这个标识外部应用访问BookProvider,因此必须是唯一的,建议加上包前缀-->
<!--android:permission 如果外界想访问BookProvider就必须添加这个权限-->
<provider
android:name=".provider.BookProvider"android:authorities="com.ryg.chapter_2.book.provider" android:permission="com.ryg.PROVIDER"android:process=":provider" >
</provider>
辅助数据库类 DbOpenHelper.java
public class DbOpenHelper extends SQLiteOpenHelper {private static final String DB_NAME = "book_provider.db";public static final String BOOK_TABLE_NAME = "book";public static final String USER_TALBE_NAME = "user";private static final int DB_VERSION = 3;private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "+ BOOK_TABLE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT)";private String CREATE_USER_TABLE = "CREATE TABLE IF NOT EXISTS "+ USER_TALBE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT,"+ "sex INT)";public DbOpenHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK_TABLE);db.execSQL(CREATE_USER_TABLE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO ignored}}
BookProvider .java
public class BookProvider extends ContentProvider {private static final String TAG = "BookProvider";public static final String AUTHORITY = "com.ryg.chapter_2.book.provider";public static final Uri BOOK_CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/book");public static final Uri USER_CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/user");public static final int BOOK_URI_CODE = 0;public static final int USER_URI_CODE = 1;private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);static {//因为BookProvider对应操作的有两张表,所以通过以下方法让他们关联不同的URI_CODE//再通过getTableName来匹配不同的表sUriMatcher.addURI(AUTHORITY, "book", BOOK_URI_CODE);sUriMatcher.addURI(AUTHORITY, "user", USER_URI_CODE);}private Context mContext;private SQLiteDatabase mDb;@Overridepublic boolean onCreate() {Log.d(TAG, "onCreate, current thread:"+ Thread.currentThread().getName());mContext = getContext();initProviderData();return true;}private void initProviderData() {mDb = new DbOpenHelper(mContext).getWritableDatabase();mDb.execSQL("delete from " + DbOpenHelper.BOOK_TABLE_NAME);mDb.execSQL("delete from " + DbOpenHelper.USER_TALBE_NAME);mDb.execSQL("insert into book values(3,'Android');");mDb.execSQL("insert into book values(4,'Ios');");mDb.execSQL("insert into book values(5,'Html5');");mDb.execSQL("insert into user values(1,'jake',1);");mDb.execSQL("insert into user values(2,'jasmine',0);");}//当该表了数据库中的数据后,需要调用mContext.getContentResolver().notifyChange(uri, null);来//通知外界当前ContentProvider中数据已经改变要观察一个ContentProvider中的数据已经发生改变,可以通过ContentResolver的registerContentObserver和
// unregisterContentObserver来实现注册和解除注册//Provider的增删改查都是在binder的线程池中进行的@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Log.d(TAG, "query, current thread:" + Thread.currentThread().getName());String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}return mDb.query(table, projection, selection, selectionArgs, null, null, sortOrder, null);}@Overridepublic String getType(Uri uri) {Log.d(TAG, "getType");return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {Log.d(TAG, "insert");String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}mDb.insert(table, null, values);mContext.getContentResolver().notifyChange(uri, null);return uri;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {Log.d(TAG, "delete");String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}int count = mDb.delete(table, selection, selectionArgs);if (count > 0) {getContext().getContentResolver().notifyChange(uri, null);}return count;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {Log.d(TAG, "update");String table = getTableName(uri);if (table == null) {throw new IllegalArgumentException("Unsupported URI: " + uri);}int row = mDb.update(table, values, selection, selectionArgs);if (row > 0) {getContext().getContentResolver().notifyChange(uri, null);}return row;}private String getTableName(Uri uri) {String tableName = null;switch (sUriMatcher.match(uri)) {case BOOK_URI_CODE:tableName = DbOpenHelper.BOOK_TABLE_NAME;break;case USER_URI_CODE:tableName = DbOpenHelper.USER_TALBE_NAME;break;default:break;}return tableName;}}
ProviderActivity .java
public class ProviderActivity extends Activity {private static final String TAG = "ProviderActivity";Uri bookUri = Uri.parse("content://com.ryg.chapter_2.book.provider/book");private ContentObserver mObserver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_provider);mObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);System.out.println("观察到BookContentProvider发生改变");}};getContentResolver().registerContentObserver(bookUri, true, mObserver);ContentValues values = new ContentValues();values.put("_id", 6);values.put("name", "程序设计的艺术");//通过对应的uri就可以对ContentProvider进行操作了getContentResolver().insert(bookUri, values);Cursor bookCursor = getContentResolver().query(bookUri, new String[]{"_id", "name"}, null, null, null);while (bookCursor.moveToNext()) {Book book = new Book();book.bookId = bookCursor.getInt(0);book.bookName = bookCursor.getString(1);Log.d(TAG, "query book:" + book.toString());}bookCursor.close();Uri userUri = Uri.parse("content://com.ryg.chapter_2.book.provider/user");Cursor userCursor = getContentResolver().query(userUri, new String[]{"_id", "name", "sex"}, null, null, null);while (userCursor.moveToNext()) {User user = new User();user.userId = userCursor.getInt(0);user.userName = userCursor.getString(1);user.isMale = userCursor.getInt(2) == 1;Log.d(TAG, "query user:" + user.toString());}userCursor.close();}@Overrideprotected void onDestroy() {super.onDestroy();//记得解除观察防止内存泄漏if (mObserver != null) {getContentResolver().unregisterContentObserver(mObserver);mObserver = null;}}
}
代码中有对应注释.
这篇关于ContentProvider解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!