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
- IPC机制--使用ContentProvider
- IPC机制之使用ContentProvider
- IPC机制--利用ContentProvider
- IPC机制第三篇,ContentProvider实现
- Android的IPC机制(五)—— ContentProvider的使用
- Android的IPC机制(五)—— ContentProvider的使用
- Android的IPC机制(五)—— ContentProvider的使用
- IPC机制---使用AIDL
- IPC 机制---使用Socket
- IPC机制--使用Socket
- IPC机制的几种通讯方式之ContentProvider
- Android IPC机制 ContentProvider进行进程间通信
- IPC机制系列之三 Android中的IPC方式 (ContentProvider,Socket)
- IPC机制--使用文件通信
- ContentProvider实现IPC
- Android IPC机制(四)用ContentProvider进行进程间通信
- Android IPC机制(四)用ContentProvider进行进程间通信
- Android进程间(IPC机制)通信(Bundler,Messenger,AIDL,ContentProvider)
- 小胖说swift02--------Swift如何使用Masonry和SnapKit
- JS刷新页面总和!多种JS刷新页面代码!
- Android Application对象必须掌握的七点
- Runtime
- 数据查询网站
- IPC机制--使用ContentProvider
- 数据结构实验之栈六:下一较大值(二)
- jeeCmsV7-src 源码解析之三(ehcache-hibernate.xml)
- linux--vi命令大全
- fiddler抓https的包
- LeetCode | Best Time to Buy and Sell Stock III
- c++中replace函数用法总结
- 我的第一个iOS应用程序: 土豪晒单
- ACM学习历程11——Multiset集合容器的使用