IPC机制--使用ContentProvider

IPC机制--使用ContentProvider

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

ContentProvider.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 {
               sUriMatcher .addURI( AUTHORITY , "book" , BOOK_URI_CODE );
               sUriMatcher .addURI( AUTHORITY , "user" , USER_URI_CODE );
       }

        private Context mContext ;
        private SQLiteDatabase mDb ;

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

            //ContentProvider创建的时候,初始化数据库。注意这里仅仅是为了演示,实际使用中不推荐在主线程中进行耗时
             //的数据库操作。
              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);" );
       }

        @Override
        public 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 );
       }

        @Override
        public String getType(Uri uri) {
              Log. d( TAG , "getType" );
               return null ;
       }

        @Override
        public 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;
       }

        @Override
        public 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;
       }

        @Override
        public 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;
       }
}


注册 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线程中

public class ProviderActivity extends Activity {
    private static final String TAG = "ProviderActivity" ;

    @Override
    protected void onCreate(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 = new ContentValues();
        values.put( "_id" , 6);
        values.put( "name" , "程序设计的艺术" );
        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();
    }
}


SQLiteOpenHelper 数据库


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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL( CREATE_BOOK_TABLE );
        db.execSQL( CREATE_USER_TABLE );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO ignored
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值