ContentProvider:即内容提供者,用来管理数据,并对外暴露一个uri,外部可以通过uri和数据建立联系并获取或操作数据;

服务端:
1、首先创建一个数据库类,并创建一个表;
2、创建一个ContentProvider,用来操作这个数据库和表,实现增删改查和获取所有表里的数据信息;然后注册uri(对外暴露),其他客户端可以通过ContentResolver和对外暴露的uri使用ContentProvider来操作数据库并获取数据

客户端:
1、创建一个工具类,通过ContentResolver和服务端暴露的uri来和服务端建立联系,并通过服务端的ContentProvider来操作服务端的数据库并获取数据

示例代码

服务端:

首先创建一个数据库

 package com.jiao.myaidl;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; /**
* Created by jiaocg on 2016/3/12.
* 数据库类
*/
public class EmployeeDBHelper extends SQLiteOpenHelper { private final static String DB_NAME = "myDatabase.db";//数据库名字
private final static int DB_VERSION = 1;
public final static String EMPLOYEE_TABLE_NAME = "employee";
private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "
+ EMPLOYEE_TABLE_NAME + " (id INTEGER PRIMARY KEY,"
+ "workNum TEXT," + "name TEXT," + "department TEXT)"; public EmployeeDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION); } @Override
public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK_TABLE);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

创建一个ContentProvider操作数据库

 package com.jiao.myaidl;

 import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable; /**
* Created by jiaocg on 2016/3/12.
*/
public class EmployeeProvider extends ContentProvider { private SQLiteDatabase mDb;
private final static String AUTOORITY = "com.jiao.myaidl.employee.EmployeeProvider";
private final static int EMPLOYEE_URI_CODE = 0;
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //注册uri
static {
sUriMatcher.addURI(AUTOORITY, "employee", EMPLOYEE_URI_CODE);
} @Override
public boolean onCreate() { insertDataToDb();
return true;
} @Nullable
void insertDataToDb() { mDb = new EmployeeDBHelper(getContext()).getWritableDatabase();
mDb.execSQL("delete from " + EmployeeDBHelper.EMPLOYEE_TABLE_NAME);
mDb.execSQL("insert into employee values(1,'1001','张三','销售部');");
mDb.execSQL("insert into employee values(2,'1002','李四','人事部');");
mDb.execSQL("insert into employee values(3,'1003','王五','研发部');");
mDb.execSQL("insert into employee values(4,'1004','小明','研发部');");
mDb.execSQL("insert into employee values(5,'1005','小强','销售部');");
} public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String tableName = getTableName(uri); if (tableName == null) {
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
Cursor cursor = mDb.query(tableName, projection, selection, selectionArgs, null, null, sortOrder, null);
return cursor;
} @Nullable
@Override
public String getType(Uri uri) {
return null;
} @Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
String table = getTableName(uri);
if (table == null) {
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
mDb.insert(table, null, values);
getContext().getContentResolver().notifyChange(uri, null);
return uri;
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String table = getTableName(uri);
if (table == null) {
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
int count = mDb.delete(table, selection, selectionArgs);
if (count > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
} @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
String table = getTableName(uri);
if (table == null) {
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
int row = mDb.update(table, values, selection, selectionArgs);
if (row > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
return row;
} private String getTableName(Uri uri) {
String tableName = null;
if (sUriMatcher.match(uri) == EMPLOYEE_URI_CODE) {
tableName = EmployeeDBHelper.EMPLOYEE_TABLE_NAME;
}
return tableName;
}
}

清单文件中注册ContentProvider

 

  <provider
android:name="com.jiao.myaidl.EmployeeProvider"
android:authorities="com.jiao.myaidl.employee.EmployeeProvider"
android:exported="true" />

客户端:

创建一个工具类,通过服务端暴露的uri和服务端的数据库建立联系

 package com.jiao.myaidl;

 import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import com.jiao.myaidl.entity.Employee;
import java.util.ArrayList;
import java.util.List; /**
* Created by jiaocg on 2016/3/12.
*/
public class HandleProvider { private static Context mContext;
private static HandleProvider mInstance;
private static Uri mEmployeeUri;
private static final String EMPLOYEE_CONTENT_URI = "content://com.jiao.myaidl.employee.EmployeeProvider/employee"; private HandleProvider(Context context) {
this.mContext = context;
mEmployeeUri = Uri.parse(EMPLOYEE_CONTENT_URI);
} //单例
public static HandleProvider getmInstance(Context context) {
if (mInstance == null) {
synchronized (HandleProvider.class) {
if (mInstance == null) {
mInstance = new HandleProvider(context);
}
}
} return mInstance;
} public void delete() {
ContentResolver contentResolver = mContext.getContentResolver();
String where = "id=?";
String[] where_args = {"7"};//满足条件的 值集合
contentResolver.delete(mEmployeeUri, where, where_args);
} public void update() {
ContentResolver contentResolver = mContext.getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "梁山伯");
String where = "id=?";
String[] where_args = {"1"};
contentResolver.update(mEmployeeUri, values, where, where_args);
} public void create() {
ContentValues values = new ContentValues();
values.put("id", 7);
values.put("workNum", "1006");
values.put("name", "张三丰");
values.put("department", "研发部");
mContext.getContentResolver().insert(mEmployeeUri, values);
} public List<String> query() {
List<String> list = new ArrayList<>();
Cursor cursor = mContext.getContentResolver().query(mEmployeeUri, new String[]{"id", "workNum", "name", "department"}, null, null, null); while (cursor.moveToNext()) {
Employee employee = new Employee();
employee.setId(cursor.getInt(0));
employee.setWorkNum(cursor.getString(1));
employee.setName(cursor.getString(2));
employee.setDepartment(cursor.getString(3));
String str = employee.toString();
list.add(str);
Log.d("mainActivity", "query employee:" + str);
}
cursor.close();
return list;
}
}

主代码,获取和使用服务端的数据

 package com.jiao.myaidl;

 import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button; import com.jiao.myaidl.client.R; import java.util.List; public class EmployeeActivity extends AppCompatActivity implements View.OnClickListener { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_employee); initView();
} private void initView() { Button insert_button = (Button) findViewById(R.id.insert_button);
Button delete_button = (Button) findViewById(R.id.delete_button);
Button update_button = (Button) findViewById(R.id.update_button);
Button query_button = (Button) findViewById(R.id.query_button);
Button clear_button = (Button) findViewById(R.id.clear_button);
insert_button.setOnClickListener(this);
delete_button.setOnClickListener(this);
update_button.setOnClickListener(this);
query_button.setOnClickListener(this);
clear_button.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.insert_button://插入 HandleProvider.getmInstance(this).create(); break; case R.id.delete_button:
HandleProvider.getmInstance(this).delete();
break; case R.id.update_button:
HandleProvider.getmInstance(this).update();
break;
case R.id.query_button:
List<String> list = HandleProvider.getmInstance(this).query();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)); }
break;
case R.id.clear_button: break;
} }
}

布局代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ljd.client.MainActivity"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> <Button
android:id="@+id/insert_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="插入" /> <Button
android:id="@+id/delete_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="删除" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> <Button
android:id="@+id/update_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="更新" /> <Button
android:id="@+id/query_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查询" />
</LinearLayout> </LinearLayout>

Android IPC机制之ContentProvider的更多相关文章

  1. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

  2. Android IPC机制全解析<一>

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  3. Android IPC机制基础

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  4. Android IPC机制—Binder的工作机制

    进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...

  5. 深入理解Android IPC机制之Binder机制

    Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...

  6. android IPC 机制 (开发艺术探索)

    一.IPC 机制介绍 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程和线程 ...

  7. Android IPC机制(四)用ContentProvider进行进程间通信

    前言 ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的.ContentProvider底层实现也是Binder,但是使用起来比 ...

  8. Android IPC机制之AIDL

    什么是AIDL AIDL:Android Interface Definition Language,即Android接口定义语言. Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...

  9. Android IPC机制(五)用Socket实现跨进程聊天程序

    1.Socket简介 Socket也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...

随机推荐

  1. Maven提高篇系列之(五)——处理依赖冲突

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  2. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  3. MSSQLLocalDB 连接字符串 vs2015

    <add key="MSConnectionString" value="Data Source=(localdb)\MSSQLLocalDB;Initial Ca ...

  4. 实现多表关联来方便你的SELECT查询功能

    这次来学习一下多表关联.比如在数据中创建下面几张表,你可以从主键PRIMARY KEY与外键FOREIGN KEY来看到这几张表它们之间的关系. 场所表[dbo].[SixS_Location]: 主 ...

  5. Java总结篇系列:java.lang.Object

    从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...

  6. Tomcat8访问管理页面localhost出现:403 Access Denied

    问题: Access Denied You are not authorized to view this page. If you have already configured the Manag ...

  7. Android Volley框架的使用(1)

    在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013年提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问 ...

  8. Exception loading sessions from persistent storage

    严重: Exception loading sessions from persistent storage java.io.EOFException 删除Tomcat里面的work/Catalina ...

  9. Python自动化测试工具Splinter简介和使用实例

    Splinter 快速介绍 官方网站:http://splinter.cobrateam.info/ 官方介绍: Splinter is an open source tool for testing ...

  10. GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...