聲明: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