1.内容提供者介绍
ContentPrivider内容提供者是Android中提供的专门用于不同应用间进行数据共享的方式当我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。ContentPrivider可实现进程间通信,ContentPrivider的底层是Binder
2.创建内容提供者
package com.zhoujian.contentprivider.privider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import com.zhoujian.contentprivider.db.DbOpenHelper;
/**
Created by zhoujian on 2016/11/29.
实现为实现的方法选中BookPrivider————>option+enter----->选择未实现的方法
要在清单文件中配置
<provider
android:name=".privider.BookPrivider"
android:process="com.zhoujian.contentPrivider:privider"
android:authorities="com.zhoujian.contentPrivider.bookprivider"
android:permission="com.zhoujian.contentPrivider.permission"/>
其中android:authorities="com.zhoujian.contentPrivider.bookprivider"是唯一标识
通过这个属性外部应用就可以访问这个BookPrivider,因此authorities必须是唯一的,
外部应用就可以访问这个BookPrivider,也必须加上这个权限(如果要是两个应用,就必须加上权限)
android:permission="com.zhoujian.contentPrivider.permission"
*/
public class BookPrivider extends ContentProvider
{
private static final String TAG =
"BookPrivider";
public static final String AUTHORITIES =
"com.zhoujian.contentPrivider.bookprivider";
public static final Uri BOOK_URI = Uri.parse(
"content://"+AUTHORITIES+
"/book");
public static final Uri USER_URI = Uri.parse(
"content://"+AUTHORITIES+
"/user");
private static final UriMatcher mUriMatcher =
new UriMatcher(UriMatcher.NO_MATCH);
private static final int BOOK_URI_CODE =
0;
private static final int USER_URI_CODE =
1;
static
{
mUriMatcher.addURI(AUTHORITIES,
"book",BOOK_URI_CODE);
mUriMatcher.addURI(AUTHORITIES,
"user",USER_URI_CODE);
}
private Context mContext;
private SQLiteDatabase mDatabase;
private String table;
public boolean onCreate()
{
Log.d(TAG,
"onCreate(),当前线程==="+Thread.currentThread().getName());
mContext = getContext();
initData();
return true;
}
private void initData()
{
DbOpenHelper db =
new DbOpenHelper(mContext);
mDatabase = db.getWritableDatabase();
mDatabase.execSQL(
"delete from book");
mDatabase.execSQL(
"delete from user");
mDatabase.execSQL(
"insert into book values(1,'操作系统课程');");
mDatabase.execSQL(
"insert into book values(2,'计算机网络');");
mDatabase.execSQL(
"insert into book values(3,'计算机系统结构');");
mDatabase.execSQL(
"insert into user values(1,'周建',0);");
mDatabase.execSQL(
"insert into user values(2,'宋宁宁',1);");
}
@Override
public Cursor
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
Log.d(TAG,
"query(),当前线程==="+Thread.currentThread().getName());
table = getTableName(uri);
if (table ==
null) {
throw new IllegalArgumentException(
"不支持该uir");
}
return mDatabase.query(table,projection,selection,selectionArgs,
null,
null,sortOrder,
null);
}
private String
getTableName(Uri uri) {
String tableName =
null;
switch (mUriMatcher.match(uri))
{
case BOOK_URI_CODE:
tableName = DbOpenHelper.BOOK_TABLE;
break;
case USER_URI_CODE:
tableName = DbOpenHelper.USER_TABLE;
break;
}
return tableName;
}
@Override
public String
getType(Uri uri)
{
Log.d(TAG,
"getType()");
return null;
}
@Override
public Uri
insert(Uri uri, ContentValues values)
{
table = getTableName(uri);
mDatabase.insert(table,
null,values);
mContext.getContentResolver().notifyChange(uri,
null);
Log.d(TAG,
"insert()");
return uri;
}
public int delete(Uri uri, String s, String[] strings)
{
table = getTableName(uri);
int count = mDatabase.delete(table,s,strings);
if (count>
0) {
mContext.getContentResolver().notifyChange(uri,
null);
}
Log.d(TAG,
"delete()");
return count;
}
@Override
public int update(Uri uri, ContentValues values, String s, String[] strings)
{
Log.d(TAG,
"update()");
table = getTableName(uri);
int row = mDatabase.update(table,values,s,strings);
if (row>
0) {
mContext.getContentResolver().notifyChange(uri,
null);
}
Log.d(TAG,
"delete()");
return row;
}
}
3.创建数据库
package com.zhoujian.contentprivider.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by zhoujian on 2016/11/30.
*/
public class DbOpenHelper extends SQLiteOpenHelper
{
private static final String DB_NAME=
"provider.db";
public static final String BOOK_TABLE =
"book";
public static final String USER_TABLE =
"user";
private static final int DB_VERSION =
1;
public DbOpenHelper(Context context)
{
super(context, DB_NAME,
null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database)
{
database.execSQL(
"CREATE TABLE IF NOT EXISTS " + BOOK_TABLE +
"(_id INTEGER PRIMARY KEY," +
"name TEXT)");
database.execSQL(
"CREATE TABLE IF NOT EXISTS "
+ USER_TABLE +
"(_id INTEGER PRIMARY KEY," +
"name TEXT,"
+
"sex INT)");
}
@Override
public void onUpgrade(SQLiteDatabase database,
int i,
int i1)
{
}
}
4.实现进程间通信
package com.zhoujian.contentprivider.activity;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import com.zhoujian.contentprivider.R;
import com.zhoujian.contentprivider.bean.Book;
import com.zhoujian.contentprivider.bean.User;
/**
ContentPrivider:内容提供者
ContentPrivider是Android中提供的专门用于不同应用间进行数据共享的方式
当我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。
ContentPrivider可实现进程间通信
ContentPrivider的底层是Binder
*/
public class MainActivity extends Activity
{
public static final String TAG =
"MainActivity";
private Uri bookUri;
private Uri userUri;
private Cursor bookCursor;
private int mInt;
private String mString;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
bookUri = Uri.parse(
"content://com.zhoujian.contentPrivider.bookprivider/book");
ContentValues values =
new ContentValues();
values.put(
"_id",
4);
values.put(
"name",
"市场营销学");
getContentResolver().insert(bookUri,values);
bookCursor = getContentResolver().query(bookUri,
new String[]{
"_id",
"name"},
null,
null,
null);
Book book =
null;
while (bookCursor.moveToNext())
{
book =
new Book();
mInt = bookCursor.getInt(
0);
book.setBookId(mInt);
mString = bookCursor.getString(
1);
book.setBookName(mString);
Log.d(TAG, book.toString());
}
bookCursor.close();
}
catch (Exception e){
e.printStackTrace();
}
userUri = Uri.parse(
"content://com.zhoujian.contentPrivider.bookprivider/user");
Cursor userCursor = getContentResolver().query(userUri,
new String[]{
"_id",
"name",
"sex"},
null,
null,
null);
User user =
null;
while (userCursor.moveToNext())
{
user =
new User();
int userId = userCursor.getInt(
0);
user.setUserId(userId);
String userName = userCursor.getString(
1);
user.setUserName(userName);
int isMale = userCursor.getInt(
2);
user.setIsMale(isMale);
Log.d(TAG, user.toString());
}
userCursor.close();
}
}
MainActivity和BookPrivider属于不同的进程
5.最后附上源码结构、下载地址和运行结果截图
下载地址:https://github.com/zeke123/ContentPrivider