今天小編利用閒暇時間研究了一下的安卓的四大基本組件之一 ContentProvider(內容提供者),它主要用於在不同的應用程序之間實現數據共享的功能。
ContentProvider可以理解爲一個安卓應用對外開放接口,只要符合它所定義的格式請求,就可以正常訪問執行操作,其他安卓應用程序就尅通過
ContentResolver對象與ContentProvider同名方法請求下執行。ContentProvider有很多對外可以以訪問的方法,在ContentResolver中都有方法一
一對應。具體方法在下面講解。
創建自己的內容提供者首先要新建一個類繼承抽象類ContentProvider並重寫其方法,抽象方法如下:
除了onCreate()和getType()方法外,其他的均爲CRUD操作,這些方法中,Uri參數爲與ContentProvider匹配的請求Uri,剩下的參數和SQLite的CRUD操作,基本一致。
在ContentProvider中的CRUD操作中,都會傳遞一個Uri對象,通過這個對象來匹配對應的請求,思考到如何確定uri執行那個操作呢,這時候就需要用到一個UriMatcher對象,它用來幫助內容提供者匹配uri,它所匹配的方法也很簡單,就兩個:
- void addURI(String authority,String path,int code):添加一個Uri匹配項,authority爲AndroidManifest.xml中註冊的ContentProvider中的authority屬性;path爲一個路徑,可以設置通配符,#表示任意數字,*表示任意字符串,code爲自定義的一個Uri代碼。
- int match(Uri uri):匹配傳遞的Uri,返回addURI()傳遞的code參數。改方法小編沒做大的瞭解。
理論知識說到這,下面小編用內容提供者實現了簡單的CRUD的操作,具體代碼如下:
ContentProvider:(提供數據)
ContentProvider:
public class MyLinkman extends ContentProvider {
private DbHelper db;
private SQLiteDatabase sqLiteDatabase;
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
Log.i("test","onCreate");
db = new DbHelper(getContext(),"person.db",null,3);
sqLiteDatabase = db.getReadableDatabase();
//實例化uri的匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//查詢所有
uriMatcher.addURI("com.example.contentprivoid.MyPerson","linkman",1);//添加匹配規則
//查詢單個
uriMatcher.addURI("com.example.contentprivoid.MyPerson","linkman/#",2);//添加匹配規則
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.i("test","query");
//根據匹配器去匹配
int type=uriMatcher.match(uri);
switch (type){
case 1://查詢所有
Log.i("test","查詢所有");
return sqLiteDatabase.query(false,"person",projection,selection,selectionArgs,null,null,sortOrder,null);
case 2://查詢單個
Log.i("test","查詢單個");
Long id= ContentUris.parseId(uri);
return sqLiteDatabase.query(false,"person",projection,"_id=?",new String[]{id+""},null,null,sortOrder,null);
}
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i("test","insert");
sqLiteDatabase.insert("person",null,values);
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.i("test","delete");
sqLiteDatabase.delete("person",selection,selectionArgs);
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.i("test","update");
return sqLiteDatabase.update("person",values,selection,selectionArgs);
}
}
ContentResolver內容訪問者:
//控件初始化
private void initWight() {
button = (Button) findViewById(R.id.bt_main_button);
et_main_id = (EditText) findViewById(R.id.et_main_id);//查詢
et_main_insertname = (EditText) findViewById(R.id.et_main_insertname);
et_main_insertage = (EditText) findViewById(R.id.et_main_insertage);
et_main_delete = (EditText) findViewById(R.id.et_main_delete);
et_main_updateid = (EditText) findViewById(R.id.et_main_updateid);
et_main_updatename = (EditText) findViewById(R.id.et_main_updatename);
et_main_updateage = (EditText) findViewById(R.id.et_main_updateage);
//01直接qurey詢
//02.http://localhost:8080/xxx.action?=1
//使用uri匹配器
}
//查詢
public void getData(View view){
//判斷輸入框是否爲空
if (TextUtils.isEmpty(et_main_id.getText().toString())){
uri = Uri.parse("content://com.example.contentprivoid.MyPerson/linkman");
}else{
//單詢單個
String id=et_main_id.getText().toString();
uri = Uri.parse("content://com.example.contentprivoid.MyPerson/linkman/"+id);
}
//訪問數據
Cursor cursor=cr.query(uri,null,null,null,null);
while (cursor.moveToNext()){
int pid=cursor.getInt(cursor.getColumnIndex("_id"));;
String uname=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
Log.i("test",pid+" "+uname+" "+age);
}
}
//添加
public void addlinkman(View view){
if (TextUtils.isEmpty(et_main_insertname.getText().toString())&&TextUtils.isEmpty(et_main_insertage.getText().toString())){
Toast.makeText(this,"請填寫完整",Toast.LENGTH_SHORT).show();
}else{
String name= et_main_insertname.getText().toString();
String age= et_main_insertage.getText().toString();
ContentValues values=new ContentValues();
values.put("name",name);
values.put("age",age);
uri = Uri.parse("content://com.example.contentprivoid.MyPerson");
cr.insert(uri,values);
Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show();
}
}
//刪除
public void deletelinkman(View view){
String id=et_main_delete.getText().toString();
uri = Uri.parse("content://com.example.contentprivoid.MyPerson");
cr.delete(uri,"_id=?",new String[]{id+""});
}
//修改
public void updatelinkman(View view){
String id=et_main_updateid.getText().toString();
String name= et_main_updatename.getText().toString();
String age= et_main_updateage.getText().toString();
uri = Uri.parse("content://com.example.contentprivoid.MyPerson");
ContentValues values=new ContentValues();
if (TextUtils.isEmpty(et_main_updatename.getText().toString())){
}else {
values.put("name",name);
}
if (TextUtils.isEmpty(et_main_updateage.getText().toString())){
}else{
values.put("age",age);
}
int update = cr.update(uri, values, "_id=?", new String[]{id + ""});
if (update>0){
Toast.makeText(this,"修改成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"修改失敗",Toast.LENGTH_SHORT).show();
}
}
基本代碼就這些,清單文件的配置小編就粘貼啦,希望對初學者有幫助。
ok,今天內容提供者就寫到這,下次小編閒暇時間在學習內容提供者啦!