ContentProvider:即内容提供者,用来管理数据,并对外暴露一个uri,外部可以通过uri和数据建立联系并获取或操作数据;
服务端:
1、首先创建一个数据库类,并创建一个表;
2、创建一个ContentProvider,用来操作这个数据库和表,实现增删改查和获取所有表里的数据信息;然后注册uri(对外暴露),其他客户端可以通过ContentResolver和对外暴露的uri使用ContentProvider来操作数据库并获取数据
客户端:
1、创建一个工具类,通过ContentResolver和服务端暴露的uri来和服务端建立联系,并通过服务端的ContentProvider来操作服务端的数据库并获取数据
示例代码
服务端:
首先创建一个数据库
1 package com.jiao.myaidl; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 7 /** 8 * Created by jiaocg on 2016/3/12. 9 * 数据库类 10 */ 11 public class EmployeeDBHelper extends SQLiteOpenHelper { 12 13 private final static String DB_NAME = "myDatabase.db";//数据库名字 14 private final static int DB_VERSION = 1; 15 public final static String EMPLOYEE_TABLE_NAME = "employee"; 16 private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS " 17 + EMPLOYEE_TABLE_NAME + " (id INTEGER PRIMARY KEY," 18 + "workNum TEXT," + "name TEXT," + "department TEXT)"; 19 20 public EmployeeDBHelper(Context context) { 21 super(context, DB_NAME, null, DB_VERSION); 22 23 } 24 25 @Override 26 public void onCreate(SQLiteDatabase db) { 27 28 db.execSQL(CREATE_BOOK_TABLE); 29 } 30 31 @Override 32 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 33 34 } 35 }
创建一个ContentProvider操作数据库
1 package com.jiao.myaidl; 2 3 import android.content.ContentProvider; 4 import android.content.ContentValues; 5 import android.content.UriMatcher; 6 import android.database.Cursor; 7 import android.database.sqlite.SQLiteDatabase; 8 import android.net.Uri; 9 import android.support.annotation.Nullable; 10 11 /** 12 * Created by jiaocg on 2016/3/12. 13 */ 14 public class EmployeeProvider extends ContentProvider { 15 16 private SQLiteDatabase mDb; 17 private final static String AUTOORITY = "com.jiao.myaidl.employee.EmployeeProvider"; 18 private final static int EMPLOYEE_URI_CODE = 0; 19 private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 20 21 22 //注册uri 23 static { 24 sUriMatcher.addURI(AUTOORITY, "employee", EMPLOYEE_URI_CODE); 25 } 26 27 28 @Override 29 public boolean onCreate() { 30 31 insertDataToDb(); 32 return true; 33 } 34 35 36 @Nullable 37 void insertDataToDb() { 38 39 mDb = new EmployeeDBHelper(getContext()).getWritableDatabase(); 40 mDb.execSQL("delete from " + EmployeeDBHelper.EMPLOYEE_TABLE_NAME); 41 mDb.execSQL("insert into employee values(1,'1001','张三','销售部');"); 42 mDb.execSQL("insert into employee values(2,'1002','李四','人事部');"); 43 mDb.execSQL("insert into employee values(3,'1003','王五','研发部');"); 44 mDb.execSQL("insert into employee values(4,'1004','小明','研发部');"); 45 mDb.execSQL("insert into employee values(5,'1005','小强','销售部');"); 46 } 47 48 49 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 50 51 String tableName = getTableName(uri); 52 53 if (tableName == null) { 54 throw new IllegalArgumentException("Unsupported URI: " + uri); 55 } 56 Cursor cursor = mDb.query(tableName, projection, selection, selectionArgs, null, null, sortOrder, null); 57 return cursor; 58 } 59 60 @Nullable 61 @Override 62 public String getType(Uri uri) { 63 return null; 64 } 65 66 @Nullable 67 @Override 68 public Uri insert(Uri uri, ContentValues values) { 69 String table = getTableName(uri); 70 if (table == null) { 71 throw new IllegalArgumentException("Unsupported URI: " + uri); 72 } 73 mDb.insert(table, null, values); 74 getContext().getContentResolver().notifyChange(uri, null); 75 return uri; 76 } 77 78 @Override 79 public int delete(Uri uri, String selection, String[] selectionArgs) { 80 String table = getTableName(uri); 81 if (table == null) { 82 throw new IllegalArgumentException("Unsupported URI: " + uri); 83 } 84 int count = mDb.delete(table, selection, selectionArgs); 85 if (count > 0) { 86 getContext().getContentResolver().notifyChange(uri, null); 87 } 88 return count; 89 } 90 91 @Override 92 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 93 String table = getTableName(uri); 94 if (table == null) { 95 throw new IllegalArgumentException("Unsupported URI: " + uri); 96 } 97 int row = mDb.update(table, values, selection, selectionArgs); 98 if (row > 0) { 99 getContext().getContentResolver().notifyChange(uri, null); 100 } 101 return row; 102 } 103 104 105 private String getTableName(Uri uri) { 106 String tableName = null; 107 if (sUriMatcher.match(uri) == EMPLOYEE_URI_CODE) { 108 tableName = EmployeeDBHelper.EMPLOYEE_TABLE_NAME; 109 } 110 return tableName; 111 } 112 }
清单文件中注册ContentProvider
1 <provider 2 android:name="com.jiao.myaidl.EmployeeProvider" 3 android:authorities="com.jiao.myaidl.employee.EmployeeProvider" 4 android:exported="true" />
客户端:
创建一个工具类,通过服务端暴露的uri和服务端的数据库建立联系
1 package com.jiao.myaidl; 2 3 import android.content.ContentResolver; 4 import android.content.ContentValues; 5 import android.content.Context; 6 import android.database.Cursor; 7 import android.net.Uri; 8 import android.util.Log; 9 import com.jiao.myaidl.entity.Employee; 10 import java.util.ArrayList; 11 import java.util.List; 12 13 /** 14 * Created by jiaocg on 2016/3/12. 15 */ 16 public class HandleProvider { 17 18 private static Context mContext; 19 private static HandleProvider mInstance; 20 private static Uri mEmployeeUri; 21 private static final String EMPLOYEE_CONTENT_URI = "content://com.jiao.myaidl.employee.EmployeeProvider/employee"; 22 23 private HandleProvider(Context context) { 24 this.mContext = context; 25 mEmployeeUri = Uri.parse(EMPLOYEE_CONTENT_URI); 26 } 27 28 29 //单例 30 public static HandleProvider getmInstance(Context context) { 31 if (mInstance == null) { 32 synchronized (HandleProvider.class) { 33 if (mInstance == null) { 34 mInstance = new HandleProvider(context); 35 } 36 } 37 } 38 39 return mInstance; 40 } 41 42 43 public void delete() { 44 ContentResolver contentResolver = mContext.getContentResolver(); 45 String where = "id=?"; 46 String[] where_args = {"7"};//满足条件的 值集合 47 contentResolver.delete(mEmployeeUri, where, where_args); 48 } 49 50 51 public void update() { 52 ContentResolver contentResolver = mContext.getContentResolver(); 53 ContentValues values = new ContentValues(); 54 values.put("name", "梁山伯"); 55 String where = "id=?"; 56 String[] where_args = {"1"}; 57 contentResolver.update(mEmployeeUri, values, where, where_args); 58 } 59 60 public void create() { 61 ContentValues values = new ContentValues(); 62 values.put("id", 7); 63 values.put("workNum", "1006"); 64 values.put("name", "张三丰"); 65 values.put("department", "研发部"); 66 mContext.getContentResolver().insert(mEmployeeUri, values); 67 } 68 69 70 public List<String> query() { 71 List<String> list = new ArrayList<>(); 72 Cursor cursor = mContext.getContentResolver().query(mEmployeeUri, new String[]{"id", "workNum", "name", "department"}, null, null, null); 73 74 while (cursor.moveToNext()) { 75 Employee employee = new Employee(); 76 employee.setId(cursor.getInt(0)); 77 employee.setWorkNum(cursor.getString(1)); 78 employee.setName(cursor.getString(2)); 79 employee.setDepartment(cursor.getString(3)); 80 String str = employee.toString(); 81 list.add(str); 82 Log.d("mainActivity", "query employee:" + str); 83 } 84 cursor.close(); 85 return list; 86 } 87 }
主代码,获取和使用服务端的数据
1 package com.jiao.myaidl; 2 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import android.view.View; 6 import android.widget.Button; 7 8 import com.jiao.myaidl.client.R; 9 10 import java.util.List; 11 12 public class EmployeeActivity extends AppCompatActivity implements View.OnClickListener { 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_employee); 18 19 initView(); 20 } 21 22 private void initView() { 23 24 Button insert_button = (Button) findViewById(R.id.insert_button); 25 Button delete_button = (Button) findViewById(R.id.delete_button); 26 Button update_button = (Button) findViewById(R.id.update_button); 27 Button query_button = (Button) findViewById(R.id.query_button); 28 Button clear_button = (Button) findViewById(R.id.clear_button); 29 insert_button.setOnClickListener(this); 30 delete_button.setOnClickListener(this); 31 update_button.setOnClickListener(this); 32 query_button.setOnClickListener(this); 33 clear_button.setOnClickListener(this); 34 } 35 36 @Override 37 public void onClick(View v) { 38 switch (v.getId()) { 39 case R.id.insert_button://插入 40 41 HandleProvider.getmInstance(this).create(); 42 43 break; 44 45 case R.id.delete_button: 46 HandleProvider.getmInstance(this).delete(); 47 break; 48 49 case R.id.update_button: 50 HandleProvider.getmInstance(this).update(); 51 break; 52 case R.id.query_button: 53 List<String> list = HandleProvider.getmInstance(this).query(); 54 for (int i = 0; i < list.size(); i++) { 55 System.out.println(list.get(i)); 56 57 } 58 break; 59 case R.id.clear_button: 60 61 break; 62 } 63 64 } 65 }
布局代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="vertical" 7 android:paddingBottom="@dimen/activity_vertical_margin" 8 android:paddingLeft="@dimen/activity_horizontal_margin" 9 android:paddingRight="@dimen/activity_horizontal_margin" 10 android:paddingTop="@dimen/activity_vertical_margin" 11 tools:context="com.example.ljd.client.MainActivity"> 12 13 <LinearLayout 14 android:layout_width="match_parent" 15 android:layout_height="wrap_content" 16 android:orientation="horizontal"> 17 18 <Button 19 android:id="@+id/insert_button" 20 android:layout_width="match_parent" 21 android:layout_height="match_parent" 22 android:layout_weight="1" 23 android:text="插入" /> 24 25 <Button 26 android:id="@+id/delete_button" 27 android:layout_width="match_parent" 28 android:layout_height="match_parent" 29 android:layout_weight="1" 30 android:text="删除" /> 31 </LinearLayout> 32 33 <LinearLayout 34 android:layout_width="match_parent" 35 android:layout_height="wrap_content" 36 android:orientation="horizontal"> 37 38 <Button 39 android:id="@+id/update_button" 40 android:layout_width="match_parent" 41 android:layout_height="wrap_content" 42 android:layout_weight="1" 43 android:text="更新" /> 44 45 <Button 46 android:id="@+id/query_button" 47 android:layout_width="match_parent" 48 android:layout_height="wrap_content" 49 android:layout_weight="1" 50 android:text="查询" /> 51 </LinearLayout> 52 53 </LinearLayout>