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