Android IPC机制之ContentProvider
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的更多相关文章
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...
- Android IPC机制全解析<一>
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- Android IPC机制基础
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- Android IPC机制—Binder的工作机制
进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...
- 深入理解Android IPC机制之Binder机制
Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...
- android IPC 机制 (开发艺术探索)
一.IPC 机制介绍 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程和线程 ...
- Android IPC机制(四)用ContentProvider进行进程间通信
前言 ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的.ContentProvider底层实现也是Binder,但是使用起来比 ...
- Android IPC机制之AIDL
什么是AIDL AIDL:Android Interface Definition Language,即Android接口定义语言. Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...
- Android IPC机制(五)用Socket实现跨进程聊天程序
1.Socket简介 Socket也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...
随机推荐
- 采用Kettle分页处理大数据量抽取任务
作者:Grey 原文地址: http://greyzeng.com/2016/10/31/big-data-etl/ 需求: 将Oracle数据库中某张表历史数据导入MySQL的一张表里面. 源表(O ...
- .Net中的并行编程-1.路线图
最近半年一直研究用.net进行并行程序的开发与设计,再研究的过程中颇有收获,所以画了一个图总结了一下并行编程的基础知识点,这些知识点是并行编程的基础,有助于我们编程高性能的程序,里面的某些结构实现机制 ...
- Java初识
基础概念 特点: 完全面向对象,动态 解释性,简单.易移植,跨平台 安全健壮,高性能 多线程,分布式 三种核心机制: Java虚拟机 Java Virtual Machine 垃圾收集机制 Garba ...
- 使用Aspose插件对Excel操作
使用使用Aspose插件对Excel文档进行导入导出操作 使用前请先下载Aspose插件引用 Excel导入: 前台使用file标签获取,submit方式提交. <form id="f ...
- 查看Eclipse版本
点击Help->About Eclipse,在弹出的对话框下部有很多logo. 鼠标在logo上停留,会有提示,找出提示为Eclipse.org的那个logo,即为Eclipse的logo,点击 ...
- 2015暑假多校联合---Cake(深搜)
题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...
- Javascript——DOM
DOM(Document Object Model)文档对象模型 --DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构. D--doument(文档).当创建一个网页并把它加载到we ...
- python 学习笔记6(函数)
函数 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 1.减少代码重复 2.保持代码的一致性 3.方便修改,可扩展性 函数的创建 #简单 ...
- Android开发中Eclispe相关问题及相应解决(持续更新)
1.Eclipse项目中的Android Private Libraries没有自动生成. 一般而言,在Android开发中,项目中引用到的jar包会放到项目目录中的libs中,引入库会放到Andro ...
- selenium + python自动化测试环境搭建
selenium的在python平台的搭建: 搭建平台windows 准备工具如下: --------------------------------------------------------- ...