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层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...
随机推荐
- C# 6.0的属性(Property)的语法与初始值
昨晚有学点新知识,是有关C# 6.0的. 在数据库创建有一张表: CREATE TABLE [dbo].[ToolLocation] ( ,) NOT NULL PRIMARY KEY, ) NOT ...
- C#中的可空值类型
C# 不允许把 null 赋给一个值类型的数据.在 C# 中,以下语句是非法的: int a = null; // 非法 但是,利用 C# 定义的一个修饰符,可将一个变量声明为一个可空(null ...
- 头文件里面的ifndef /define/endif的作用
c,c++里面,头文件里面的ifndef /define/endif的作用 今天和宿舍同学讨论一个小程序,发现有点地方不大懂······ 是关于头文件里面的一些地方: 例如:要编写头文件test.h ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(四)Packet
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield
IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接 ...
- 以Unix之名
即便有了MBP,有时,还是想把MBP装上一个Linux发行版,因为习惯了Linux下的折腾. 但每次想要动手安装时,都会告诉自己,MacOS是很纯正的Unix系统,这样,内心的冲动就可以再多压一压. ...
- Word, PPT和Excel的常用技巧(持续更新)
本文的目的是记录平时使用Word, PowerPoint和Excel的过程中的一些小技巧,用于提升工作效率. 此文会不定期的更新,更新频率完全取决于实际使用遇到的问题的次数. 目录 Word Powe ...
- Fiddler (三) Composer创建和发送HTTP Request
之前已经写过两篇Fiddler的文章了,分别是[Fiddler教程] [Fiddler script用法]. 我准备把Fiddler写成一个系列. Fiddler的功能还有很多, 很多功能都没有 ...
- ejs-mate
安装 npm install ejs-mate --save 模板方法: 1.layout 2.partial 3.block
- 第2章 如何构建布局良好的Windows程序
01.菜单栏(MenuStrip) 设置快捷键方式: 方式一:1.设置菜单项的Text属性为(打开(&F)), 首先必须按住alt+主菜单快捷键进入到对应的主菜单, 然后直接按F就可以打开子窗 ...