ContentProvider資料共用方法的使用

來源:互聯網
上載者:User

ContentProvider 完全屏蔽的了資料提供者的資料存取方式,只要通過調用ContentProvider提供的借口就可以去所有的資料進行操作

ContentProvider資料模式類似於資料庫的表,每一行都是一條資料,每一列都具有相同的資料類型,其通過URI來擷取資料來源,其使用的URI文法結構如下:

content://<authority>/<data_path>/<id>

(content://)表示首碼,表示該URI用於ContentProvider定位資源,無須修改

<authority>表示授權者的名稱,用來確定具體由哪一個Contentprovider來提供資源

<data_path>表示路徑,用來確定請求的是哪個資料集

例如:content://com.lonuery.mycontentprovider/abc  表示的就是在com.lonuery.mycontentprovider 包下的資料集abc

一:建立資料提供者

一般分為三步:1:繼承ContentProvider,實現基本資料操作的六個函數 2:聲明contenturi 實現UriMatcher 3:註冊ContentProvider

下面是一個建立資料提供者的小例子:

public class MyProvider extends ContentProvider {Context context;SQLiteDatabase sdb;private static UriMatcher uriMatche;//用來分析用戶端那發來的額URI到底數個什麼樣的URIstatic {uriMatche = new UriMatcher(UriMatcher.NO_MATCH);uriMatche.addURI("com.lonuery.mycontextprovider","abc", 1);//authority 一般用包名指定(保證全球唯一)//path:取資料的路徑,取資料的方式//code 匹配的結果//content://com.lonuery.DatabaseServer/abc/1  取單條資料,abc後數字為幾就表示取幾條資料,如果沒有那就是多條//content://com.lonuery.DatabaseServer/abc  取多條資料uriMatche.addURI("com.lonuery.mycontextprovider", "abc/#", 2);};//初始化UriMatcher (添加的匹配的規則)//做白日夢的人,上不了最前線,敢愛敢做的人超級精彩!@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {String argId = arg0.getPathSegments().get(1);int delcount = sdb.delete("student", "_id=?", new String[]{argId});return delcount;}@Overridepublic String getType(Uri arg0) {String retString = null;switch (uriMatche.match(arg0)) {case 2:retString = "vnd.android:cursor.item/vnd.com.lonuery.mycontextprovider.abc";break;case 1:retString="vnd.android:cursor.dir/vnd.com.lonuery.mycontextprovider.abc";break;default:break;}return retString;}@Overridepublic Uri insert(Uri arg0, ContentValues arg1) {long retId = sdb.insert("Student", null,arg1);if(retId>0){Uri tempUri = Uri.parse("com.lonuery.mycontextprovider/abc");Uri newUri = ContentUris.withAppendedId(tempUri,retId);return newUri;}throw new SQLException("資料插入失敗"+arg0);}/* * 建立資料庫*/@Overridepublic boolean onCreate() {                Context context = getContext();                DatabaseHepler databaseHepler = new DatabaseHepler(context, "Student.db", null, 1);sdb = databaseHepler.getWritableDatabase();if(sdb!=null){return true;//建立成功則返回true}return false;}@Overridepublic Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4){Cursor cursor=null;switch (uriMatche.match(arg0)) {case 2://單條資料
                String argId = arg0.getPathSegments().get(1);

 cursor = sdb.query("Student", arg1, "_id=?", new String[]{argId},null, null, null);break;case 1://多條資料cursor =sdb.query("Student", null, null, null, null, null, arg4);break;default:break;}return cursor;}@Overridepublic int update(Uri arg0,
ContentValues arg1, String arg2, String[] arg3) {String argId = arg0.getPathSegments().get(1);int upcount = sdb.update("School",arg1, "_id=?", new String[]{argId});return upcount;}public static class DatabaseHepler extends SQLiteOpenHelper{String str = "create
table Student(_id Integer primary key autoincrement,name varchar(20),age varchar(20),sex varchar(20))";public DatabaseHepler(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor
stub}@Overridepublic void onCreate(SQLiteDatabase arg0) {arg0.execSQL(str);}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {// TODO Auto-generated method stub}}}

通過content使用資料提供者的資料,進行,插入,單行查詢,多行查詢,刪除行,更新行

public class ClientActivity extends Activity implements OnClickListener{Button btnInsert,btnQuerySingle,btnQueryMore,btnDelete,btnUpDate;TextView tv;EditText et;ContentResolver cr;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_client);                cr = getContentResolver();//得到資料共用的用戶端                btnInsert = (Button)findViewById(R.id.button1);        btnQuerySingle =(Button)findViewById(R.id.button2);        btnQueryMore =(Button)findViewById(R.id.button3);        btnUpDate =(Button)findViewById(R.id.button4);        btnDelete =(Button)findViewById(R.id.button5);        tv =(TextView)findViewById(R.id.textView1);        et =(EditText)findViewById(R.id.editText1);                btnInsert.setOnClickListener(this);        btnQueryMore.setOnClickListener(this);        btnQuerySingle.setOnClickListener(this);        btnUpDate.setOnClickListener(this);        btnDelete.setOnClickListener(this);         }@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.button1:String baseuri = "content://com.lonuery.mycontextprovider/abc";Uri uri = Uri.parse(baseuri);ContentValues cv = new ContentValues();cv.put("name", "你妹");cv.put("age", "23");cv.put("sex", "男");cr.insert(uri, cv);break;case R.id.button2:String queryBaseUri = "content://com.lonuery.mycontextprovider/abc";String id = et.getText().toString();String queryOneUri = queryBaseUri + "/" +  id;// content://com.newer.DataBaseServer/abc/7Cursor cursorOne = cr.query(Uri.parse(queryOneUri), null, null, null, null);if (cursorOne.moveToFirst()) {String idStr =cursorOne.getString(cursorOne.getColumnIndex("_id"));String name =cursorOne.getString(cursorOne.getColumnIndex("name"));String sex =cursorOne.getString(cursorOne.getColumnIndex("sex"));String age =cursorOne.getString(cursorOne.getColumnIndex("age"));tv.setText(" "+idStr + "  " + name + " " + sex + "  " + age + " \n");}break;case R.id.button3:String queryAllUri = "content://com.lonuery.mycontextprovider/abc";Cursor cursor = cr.query(Uri.parse(queryAllUri), null, null, null, null);tv.setText("");if (cursor.moveToFirst()) {do {String idMany =cursor.getString(cursor.getColumnIndex("_id"));String name =cursor.getString(cursor.getColumnIndex("name"));String sex =cursor.getString(cursor.getColumnIndex("sex"));String age =cursor.getString(cursor.getColumnIndex("age"));tv.append(" "+idMany + "  " + name + " " + sex + "  " + age + " \n");} while(cursor.moveToNext());}break;case R.id.button5:String queryBaseUri2 = "content://com.lonuery.mycontextprovider/abc";String delId = et.getText().toString();String delOneUri = queryBaseUri2 + "/" +  delId;cr.delete(Uri.parse(delOneUri), null, null);break;case R.id.button4:String updataBaseUri="content://com.lonuery.mycontextprovider/abc";String updataColumn = et.getText().toString();ContentValues updata = new ContentValues();updata.put("sex",updataColumn);cr.update(Uri.parse(updataBaseUri), updata,null,null);break;default:break;}}   }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.