android ContentProvider入門使用

來源:互聯網
上載者:User

聲明:Server指的是提供資料庫的應用,Client指的是使用資料庫的應用

許可權:如果Server的Provider標籤沒有加入任何許可權,那麼CLient不用聲明任何許可權,就是可以操作Server資料

           如果Server的Provider標籤加入了許可權,那麼CLient必須聲明許可權,才可以操作Server資料,而且在Client的許可權中<permission> 和<use-permission>都要加上

下面上核心代碼:

首先是Server的代碼

DataBaseHelper.java

package com.example.contentproviderserver;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper{private final static String NAME = "test_db";private String CREATE_TALBE1="create table table1(id INTEGER PRIMARY KEY AUTOINCREMENT,data varchar(20));";private String CREATE_TALBE2="create table table2(id2 int,data1 varchar(20));";public DatabaseHelper(Context context) {super(context, NAME, null, 1);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL(CREATE_TALBE1);db.execSQL(CREATE_TALBE2);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}@Overridepublic SQLiteDatabase getReadableDatabase() {// TODO Auto-generated method stubreturn super.getReadableDatabase();}@Overridepublic SQLiteDatabase getWritableDatabase() {// TODO Auto-generated method stubreturn super.getWritableDatabase();}}

上面代碼不做講解,如果不明白,就去看一下sqlite資料庫的知識。

MyProvider.java

package com.example.contentproviderserver;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.util.Log;public class MyProvider extends ContentProvider {private static final UriMatcher sUriMatcher;private DatabaseHelper mDatabaseHelper;private String TAG="MyProvider";static {sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);sUriMatcher.addURI("com.test.provider", "table1", 1);sUriMatcher.addURI("com.test.provider", "table1/#", 11);sUriMatcher.addURI("com.test.provider", "table2", 2);sUriMatcher.addURI("com.test.provider", "table2/#", 22);//如果有其他的表 可以繼續增加。。。}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubint code;code = sUriMatcher.match(uri);SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();switch (code) {case 1:db.delete("table1", selection, selectionArgs);break;case 2:db.delete("table2", selection, selectionArgs);break;case 11:Log.i(TAG, "匹配了單行。。。");db.delete("table1", selection, selectionArgs); break;case 22:db.delete("table2", selection, selectionArgs); break;}return 0;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubswitch (sUriMatcher.match(uri)) {case 1:case 2:return "vnd.android.cursor.dir/provider";  //匹配整張表case 11:case 22:return "vnd.android.cursor.item/provider";  //匹配單行,個人感覺比較雞肋。一般不匹配單行,除非效率要求很高default:return "error";}}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubint code;code = sUriMatcher.match(uri);SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();long rowID;Log.i(TAG, "insert code--->"+code);switch (code) {case 1:rowID=db.insert("table1", null, values);if(rowID<0){Log.i(TAG, "插入失敗");}else{ Uri rowUri = ContentUris.withAppendedId(uri, rowID);            getContext().getContentResolver().notifyChange(rowUri, null);            return rowUri;}break;case 2:rowID=db.insert("table2", null, values);if(rowID<0){Log.i(TAG, "插入失敗");}else{ Uri rowUri = ContentUris.withAppendedId(uri, rowID);            getContext().getContentResolver().notifyChange(rowUri, null);            return rowUri;}break;case 11://db.insert("table1", null, values);break;case 22://db.insert("table2", null, values);break;}return null;}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubmDatabaseHelper = new DatabaseHelper(getContext());return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubreturn null;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}

這裡使用了UriMather來匹配Uri找到指定的表,從而動作表。。

Manifest.xml

在<application>標籤內部加入

  <provider            android:name="com.example.contentproviderserver.MyProvider"            android:authorities="com.test.provider"            android:readPermission="com.myprovider.read"            android:writePermission="com.myprovider.write"            android:enabled="true" >        </provider>

好了 ,Server代碼完畢。。

Client代碼

MainActivity.java

package com.example.contentproviderclient;import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.ContentValues;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener{Button bt1;Button bt2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bt1=(Button)findViewById(R.id.bt1);bt2=(Button)findViewById(R.id.bt2);bt1.setOnClickListener(this);bt2.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubint id = v.getId();switch(id){case R.id.bt1:ContentValues cv = new ContentValues();cv.put("data", "我愛你");getContentResolver().insert(Uri.parse("content://com.test.provider/table1"),cv);break;case R.id.bt2:ContentValues cv1 = new ContentValues();cv1.put("data1", "我愛你");getContentResolver().insert(Uri.parse("content://com.test.provider/table2"),cv1);break;}}}

Manifest.xml

<uses-permission android:name="com.myprovider.write" />    <uses-permission android:name="com.myprovider.read" />    <permission android:name="com.myprovider.write" />    <permission android:name="com.myprovider.read" />

這四個標籤缺一不可。

很簡單,用一個ContentValues來組裝資料,從而操作,這裡只是舉了插入的例子,關於尋找,刪除的例子,可以自己測試。

歡迎交流,轉載請註明出處。謝謝

完整源碼:http://download.csdn.net/detail/suixiang888/5952209

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.