ContentProvider的使用

ContentProvider归于Android的四大组件之一,依据Android中的Binder机制完毕。首要运用于进程间数据传输。

当然Android四大组件都能完毕进程间数据库有哪几种的通讯,并且底层都是依据Binder来完毕的。

一.一起资源标识符(URI)

运用ContentProapprovevider需求先介绍下一起资源标识符(URI)。

ContentProvider的运用

URI分为 体系预置 & 自定义,分别对应体系内置的数据(如通讯录、日程表等等)和自定义数据库

拿下面事例中的URI举例content://com.example.myprovider/use线程安全r

content: URI前缀。

com.example.myprovider: 自定义ContentProvider仅有标识。

user:自定义的数据库表名。

二. 自定义运用内Co数据库体系工程师ntentProvider

1.手势舞教程视频慢动作 创立一个DBHeler类继承自SQLiteOpenHelper。

用于创立SqlLite数approve据库操作。

public class DBHelper extends SQLiteOpenHelper {
// 数据库名
private stati线程安全c final String DATABASE_NAME = "com_example_content_provider.db";
// 表名
public static f数据库规划inal Stri数据库规划ng USER_TABLE_NAME = "user";
//数据库版本号
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VER手势舞视频SION);
}
@Override
public void onC线程池面试题reate(SQLiteDatabase d线程撕裂者b) {
//android体系 创立 用户数据库规划表
db.execSAndroidQL("CREATE TABLE IF NOT EappearanceXISTS " + USER_TABLEandroid的drawable类_NAME + "(_id INTEGE手势暗码图画大全R PRIMARY KEY AUTOINCREMENT," + " nappreciateame TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

2.创立MyProvider继承自ContentPr手势数字1到10ovider

首要是完毕对DB数据增、删、改、查操作的手势识别封装。

public class MyProvid手势舞教程视频慢动作er extends ContentProvider {
public线程池面试题 static final String TAG = "Myandroid下载Provider_ContentProvider";
private Context mContext;
DBH数据库规划elper mDbHelper = null;
SQLiteDatabase db = null线程撕裂者;
// 设置ContentProvider的仅有标识
public static final String AUTOHORITY = "com.example.myprovider";
public static final int User_Code = 1;
// UriMatcher类运用:在ContentProvider 中注册URI
private st线程池的七个参数atic final UriMatcher mMatcher;
stat数据库体系的特色ic {
// 初始化
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 若URI资源途径 = content://comandroid的drawable类.example.线程数myprovider/user ,则回来注册码User_Code
mMa数据库tcher.addURI(AUTOHORITY, "user", User_Code);
}
// 以下是C线程池ontentProvider的6个办appstore法
/**
* 初始化ContentProvider
*/
@线程撕裂者Override
public boolean onCreate() {
mContext = getContext线程安全();
// 在ContentProv线程ider创立时对数据库进行初始化
// 留心:运行在主线程,不能做耗时操作
mDbHelper = new DBHelper(getContext());
db = mDbHelper.getWritable数据库体系的中心是Database();
// 初始化两APP个表的数据(先清空两个表,再各参加一个记载线程)
db.execSQL("delete from user");
db.execSQL("inseandroid平板电脑价格rt into user values(1,'张三');");
db.execSQL("insert into us数据库规划er values(2,'李四');");
Log.d(TAG,"onCreate");
return true;
}
/**
* 添加数据
*/
@Override
public Uri inse手势舞视频rt(Uri uri, ContentValues values) {
// 依据URI匹配 URI_CODE,然后匹配ContentProvider中相应的表名
Str线程安全ing table = getTab手势暗码leName(uri);
/手势暗码图画大全简略/ 向该表添加数据
db.insert(table, null, values);
// 当该URI的ContentProvider数据产生改动时,告知外界(即拜访该ContentProvidandroid下载安装er数据的拜访者)
mContext.getContentResolver().no数据库有哪几种tifyChange(uri, nuandroid什么意思ll);
Log.d(TAG,"insert uri:"+uri);
returapproachn uri;
}
/**
* 查询数据
*/
@Override
public Cursor query(Uriandroid的drawable类 uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 依据URI匹配 URI_CODE数据库体系的中心是,然后匹配Cont数据库管理体系entProvider中相应的表名
String table = getTableName(uri);
Log.dapp是什么意思(TAG,"android是什么手机牌子query uri:"+uri手势舞视频);
// 查询数据
return db.query(table, projection, selection, selectionArgs, null, null, sortOrder, null);
}
/**
* 更新数据
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectioappointmentnArgs) {
Log.d(TAG,"update");
return 0;
}
/**
* 删去数据
*/
@Over手势暗码ride
public int delete(Uri uri, String selection, Strinappearg[] selectionArgs) {
Log.d(TAG,"delete");
return 0;
}
@Override
public String getType(Uri uri) {
Log.d(TAG,"getType")线程池创立的四种;
return null;
}
/**
* 依据URI匹配 URI_CODE,然后匹配ContentProvider中相应的表名
*/
priva手势舞视频te Str手势识别ing getTableName(Uri uri) {
String tableName = null;
sapplicationwitch (mMatcher.match(uri)) {
case User_Co线程撕裂者de:android体系
tableName = DBHelper.USER_TABLE_NAME;
break;
}
Log.d(TAG,"getTableName uri:"+uri);
return tableName;
}
}

ContentProvider组件需求在清单文件声明:

<provider android:name=".contenandroid什么意思tprovider.MyProvider"
androi手势舞视频d:authorities="com.example.mypr手势含义图解大全ovider"
/>

3.创立MyObserver继承自ContentObserver

看上面MyProvider类的public Uri insert(Uri uri, ContentValues values)方法中代码

// 当该URI的ContentProvider数据产生改动appointment时,告知外界(appreciate即拜访该ContentProvider数apple据的拜访者)
mContext.getContentResolver().手势数字1到10notifyChange(uri, null);

也就是在调用MyObserver刺进数据时分,ConAPPtentProvider会对外发送一个告知,也就是我们能够经过ContentObserver监听到对应的uri的数据改动信息。故创立MyObserver完毕URI数据线程安全产生添加的时分,在MyObse数据库体系概论第五版课后答案rver中打印出现在UR线程的几种状况I里的数据信息。

publiandroid手机c class MyObserverandroid手机 extends ContentObserver{
public static final String TAG = "MyObserv线程池er_ContentProvider";
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if noneappreciate.
*/
public MyObserver(Handler handler) {
super(handler);
}
@Overrid手势暗码图画大全简略e
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 设置URI
Uri uri_user = Uri.parse("co手势暗码图画大全ntent://com.example.myprovider/user");
// 获取ContentResolver
Con线程池面试题tentResandroid下载安装olv线程er resolver =手势 MyApplication.getContext().getContentResolver();
// 经过ContentResolver 向ContentProvider中查询数据
Cursor cursor = resolver.query(uri_user, new Stringapple[]{"_id", "name"}, null, null, null);
while (cursor.moveToNext()) {
// 将表中数据悉数输出
Log.d(TAG数据库查询句子,"querandroid体系y user:" + cursor.getInt(0)手势舞视频 + " " + cursor.getString(1));
}
// 封闭游标
cursor.close();
}
}

4.终究在调用ContentProvider打印出DB数据库的数据

新增一条数据,并打印当时URI对线程池应的数据库表的一切数据。

// 设置数据库查询句子URI
Uri uri_user = Uri.parse("android是什么手机牌子content://com.example.myprovider/useandroid的drawable类r");appreciate
// 刺进表中数据
ContentVa手势lues values = new ContentValues();
values.puandroid什么意思t("_id", 3);
values.put("name", "王五");
// 获取ContentResolveandroid下载安装r
Cont线程数entResolver resolver = getContentResolver();
// 经过ContentResolver 依据URI 向ContentProvider中刺进数据
resolver.insert(uri_user, values);
// 经过ContentResolver 向ContentProvideappearr中查询数据
Cuandroid什么意思rsor cursor = resolver.query(uri_user, new String[]{"_id", "name"}, null, null, null);
while (cursor.moveToNext()) {
// 将表中数据悉数输出
Log.d(TAG,"query user:" + cursor.getInt(0) + " " + cursor.getString(线程池1));
}
// 封闭游标
cursor.cl手势舞视频ose();

当然,我们需求监听getContentResolver().notifyChange(uri, null),所以注册MyObserver。

private MyObserver myObserver;
//注册
myObserver = new MyObserver(new Handler());
getContentResol线程池ver().registerContentObserver(Uri.parse("content://com.exampl线程数e.myprovider/user"), false, myO数据库查询句子bserver);
//解绑
if (myOb数据库有哪几种serve线程安全r!=null) {
this.get数据库体系的特色ContentResolver().unregisterContentObserver(myObserver);
}

以上便手势舞教程视频慢动作是对ContentProvider的根本运用的介绍。假定你还感兴趣监听体系Conteandroid体系ntObserver的运android下载安装用办手势暗码法,能够再看看我的这篇文章,# Android开机自启动的两种方法,里面临体系手势导航完毕标识位Setti数据库ngs.System.getUriFor("device_provisioned")作了介绍:

传送门android平板电脑价格: # Android开机自启动的两种方法