IPC机制--使用ContentProvider

来源:互联网 发布:淘宝卖家自动核对地址 编辑:程序博客网 时间:2024/05/01 00:40
IPC机制--使用ContentProvider

ContentProvider 是Android中专门用于不同应用间进行数据共享的方式。

ContentProvider.java

publicclassBookProviderextendsContentProvider{

       privatestaticfinalStringTAG="BookProvider";

       publicstaticfinalStringAUTHORITY="com.ryg.chapter_2.book.provider";

       publicstaticfinalUriBOOK_CONTENT_URI= Uri.parse("content://"
                     +AUTHORITY+"/book");
       publicstaticfinalUriUSER_CONTENT_URI= Uri.parse("content://"
                     +AUTHORITY+"/user");

       publicstaticfinalintBOOK_URI_CODE= 0;
       publicstaticfinalintUSER_URI_CODE= 1;
       privatestaticfinalUriMatchersUriMatcher=newUriMatcher(
                     UriMatcher.NO_MATCH);

       static{
              sUriMatcher.addURI(AUTHORITY,"book",BOOK_URI_CODE);
              sUriMatcher.addURI(AUTHORITY,"user",USER_URI_CODE);
       }

       privateContextmContext;
       privateSQLiteDatabasemDb;

       @Override
       publicbooleanonCreate() {
              Log.d(TAG,"onCreate, current thread:"
                           + Thread.currentThread().getName());
              mContext= getContext();

            //ContentProvider创建的时候,初始化数据库。注意这里仅仅是为了演示,实际使用中不推荐在主线程中进行耗时
             //的数据库操作。
              initProviderData();


              returntrue;
       }

       privatevoidinitProviderData() {
              mDb=newDbOpenHelper(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);");
       }

       @Override
       publicCursorquery(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) {
                     thrownewIllegalArgumentException("Unsupported URI: "+ uri);
              }
              returnmDb.query(table, projection, selection, selectionArgs,null,
                           null, sortOrder,null);
       }

       @Override
       publicStringgetType(Uri uri) {
              Log.d(TAG,"getType");
              returnnull;
       }

       @Override
       publicUriinsert(Uri uri, ContentValues values) {
              Log.d(TAG,"insert");
              String table = getTableName(uri);
              if(table ==null) {
                     thrownewIllegalArgumentException("Unsupported URI: "+ uri);
              }
              mDb.insert(table,null, values);
              mContext.getContentResolver().notifyChange(uri,null);
              returnuri;
       }

       @Override
       publicintdelete(Uri uri, String selection, String[] selectionArgs) {
              Log.d(TAG,"delete");
              String table = getTableName(uri);
              if(table ==null) {
                     thrownewIllegalArgumentException("Unsupported URI: "+ uri);
              }
              intcount =mDb.delete(table, selection, selectionArgs);
              if(count > 0) {
                     getContext().getContentResolver().notifyChange(uri,null);
              }
              returncount;
       }

       @Override
       publicintupdate(Uri uri, ContentValues values, String selection,
                     String[] selectionArgs) {
              Log.d(TAG,"update");
              String table = getTableName(uri);
              if(table ==null) {
                     thrownewIllegalArgumentException("Unsupported URI: "+ uri);
              }
              introw =mDb.update(table, values, selection, selectionArgs);
              if(row > 0) {
                     getContext().getContentResolver().notifyChange(uri,null);
              }
              returnrow;
       }

       privateString getTableName(Uri uri) {
              String tableName =null;
              switch(sUriMatcher.match(uri)) {
              caseBOOK_URI_CODE:
                     tableName = DbOpenHelper.BOOK_TABLE_NAME;
                     break;
              caseUSER_URI_CODE:
                     tableName = DbOpenHelper.USER_TALBE_NAME;
                     break;
              default:
                     break;
              }

              returntableName;
       }
}


注册 BookProvider
其中 android:authorities 是ContentProvider的唯一标识,通过这个属性外部应用就可以访问我们的BookProvider。因此他必须是唯一的。
android:permission="com.ryg.PROVIDER" 为此BookProvider 添加访问权限,如果要想访问,就必须声明此权限。

       <provider
           android:name=".provider.BookProvider"
           android:authorities="com.ryg.chapter_2.book.provider"
           android:permission="com.ryg.PROVIDER"
           android:process=":provider">
       </provider>



ProviderActivity.java

onCreate 运行在main线程中,也就是UI线程,所以我们不能再onCreate中做耗时操作。
 增删改查 运行在Binder线程中

publicclassProviderActivityextendsActivity {
   privatestaticfinalStringTAG="ProviderActivity";

   @Override
   protectedvoidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_provider);
       //Uri uri= Uri.parse("content://com.ryg.chapter_2.book.provider");
       // getContentResolver().query(uri, null, null, null, null);
       // getContentResolver().query(uri, null, null, null, null);
       // getContentResolver().query(uri, null, null, null, null);

        Uri bookUri = Uri.parse("content://com.ryg.chapter_2.book.provider/book");
        ContentValues values =newContentValues();
        values.put("_id", 6);
        values.put("name","程序设计的艺术");
        getContentResolver().insert(bookUri, values);
        Cursor bookCursor = getContentResolver().query(bookUri,newString[]{"_id","name"},null,null,null);
       while(bookCursor.moveToNext()) {
            Book book =newBook();
            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,newString[]{"_id","name","sex"},null,null,null);
       while(userCursor.moveToNext()) {
            User user =newUser();
            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();
    }
}


SQLiteOpenHelper 数据库


publicclassDbOpenHelperextendsSQLiteOpenHelper{

   privatestaticfinalStringDB_NAME="book_provider.db";
   publicstaticfinalStringBOOK_TABLE_NAME="book";
   publicstaticfinalStringUSER_TALBE_NAME="user";

   privatestaticfinalintDB_VERSION= 3;

   privateStringCREATE_BOOK_TABLE="CREATE TABLE IF NOT EXISTS "
            +BOOK_TABLE_NAME+"(_id INTEGER PRIMARY KEY,"+"name TEXT)";

   privateStringCREATE_USER_TABLE="CREATE TABLE IF NOT EXISTS "
            +USER_TALBE_NAME+"(_id INTEGER PRIMARY KEY,"+"name TEXT,"
            +"sex INT)";

   publicDbOpenHelper(Context context) {
       super(context,DB_NAME,null,DB_VERSION);
    }

   @Override
   publicvoidonCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK_TABLE);
        db.execSQL(CREATE_USER_TABLE);
    }

   @Override
   publicvoidonUpgrade(SQLiteDatabase db,intoldVersion,intnewVersion) {
       //TODOignored
    }

}
0 0