Android中ContentProvider和ContentResolver详解

在Android中,我们的应用有的时候需要对外提供数据接口,可以有如下几种方法:
1)AIDL 2)Broadcast 3)ContentProvider。
使用AIDL需要我们编写AIDL接口以及实现,而且对方也要有相应的接口描述,有点麻烦;使用Broadcast,我们不需要任何接口描述,只要协议文档就可以了,但是有点不好就是,这种方式不直接而且是异步的;使用ContentProvider我们不需要接口描述,只需要知道协议,同时这种方式是同步的,使用方便。
下面是ContentProvider实现:
package com.backgroundservice;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.NET.Uri;
import android.util.Log;
/**
* TODO
*
* @author zengpeng
* @version 1.0 Create At : 2010-3-18 下午02:52:40
*/
public class TestContentProvider extends ContentProvider {
private SQLiteDatabase mDb;
private DatabaseHelper mDbHelper = null;
private static final String DATABASE_NAME = "rssitems.db";
private static final String DATABASE_TABLE_NAME = "rssItems";
private static final int DB_VERSION = 1;
private static final int ALL_MESSAGES = 1;
private static final int SPECIFIC_MESSAGE = 2;
// Set up our URL matchers to help us determine what an
// incoming URI parameter is.
private static final UriMatcher URI_MATCHER;
static {
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URI_MATCHER.addURI("test", "item", ALL_MESSAGES);
URI_MATCHER.addURI("test", "item/#", SPECIFIC_MESSAGE);
}
// Here's the public URI used to query for RSS items.
public static final Uri CONTENT_URI = Uri
.parse("content://test/item");
// Here are our column name constants, used to query for field values.
public static final String ID = "_id";
public static final String NAME = "NAME";
public static final String VALUE = "VALUE";
public static final String DEFAULT_SORT_ORDER = ID + " DESC";
private static class DatabaseHelper extends AbstractDatabaseHelper {
@Override
protected String[] createDBTables() {
// TODO Auto-generated method stub
String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT,"
+ VALUE + " TEXT);";
return new String[] { sql };
}
@Override
protected String[] dropDBTables() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String getDatabaseName() {
// TODO Auto-generated method stub
return DATABASE_NAME;
}
@Override
protected int getDatabaseVersion() {
// TODO Auto-generated method stub
return DB_VERSION;
}
@Override
protected String getTag() {
// TODO Auto-generated method stub
return TestContentProvider.class.getSimpleName(); }
}
/**
*
*/
public TestContentProvider() {
// TODO Auto-generated constructor stub
}
/*
* (non-Javadoc)
*
* @see android.content.ContentProvider#delete(android.Net.Uri,
* Java.lang.String, java.lang.String[])
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// NOTE Argument checking code omitted. Check your parameters!
int rowCount = mDb.delete(DATABASE_TABLE_NAME, selection, selectionArgs);
// Notify any listeners and return the deleted row count.
getContext().getContentResolver().notifyChange(uri, null);
return rowCount;
}
/*
* (non-Javadoc)
*
* @see android.content.ContentProvider#getType(android.net.Uri)
*/
@Override
public String getType(Uri uri) {
switch (URI_MATCHER.match(uri)) {
case ALL_MESSAGES:
return "vnd.android.cursor.dir/rssitem"; // List of items.
case SPECIFIC_MESSAGE:
return "vnd.android.cursor.item/rssitem"; // Specific item.
default:
return null;
}
}
/*
* (non-Javadoc)
*
* @see android.content.ContentProvider#insert(android.net.Uri,
* android.content.ContentValues)
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// NOTE Argument checking code omitted. Check your parameters! Check that
// your row addition request succeeded!
long rowId = -1;
rowId = mDb.insert(DATABASE_TABLE_NAME, NAME, values);
Uri newUri = Uri.withAppendedPath(CONTENT_URI, ""+rowId);
Log.i("TestContentProvider", "saved a record " + rowId + " " + newUri);
// Notify any listeners and return the URI of the new row.
getContext().getContentResolver().notifyChange(CONTENT_URI, null);
return newUri;
}
/*
* (non-Javadoc)
*
* @see android.content.ContentProvider#onCreate()
*/
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
try
{
mDbHelper = new DatabaseHelper();
mDbHelper.open(getContext());
mDb = mDbHelper.getMDb();
}catch(Exception e){
e.printStackTrace();
}
return true;
}
/*
* (non-Javadoc)
*
* @see android.content.ContentProvider#query(android.net.Uri,
* java.lang.String[], java.lang.String, java.lang.String[],
* java.lang.String)
*/
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// We won't bother checking the validity of params here, but you should!
// SQLiteQueryBuilder is the helper class that creates the
// proper SQL syntax for us.
SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
// Set the table we're querying.
qBuilder.setTables(DATABASE_TABLE_NAME);
// If the query ends in a specific record number, we're
// being asked for a specific record, so set the
// WHERE clause in our query.
if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
qBuilder.appendWhere("_id=" + uri.getLastPathSegment());
Log.i("TestContentProvider", "_id=" + uri.getLastPathSegment());
}
// Make the query.
Cursor c = qBuilder.query(mDb,
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
Log.i("TestContentProvider", "get records");
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
/*
* (non-Javadoc)
*
* @see android.content.ContentProvider#update(android.net.Uri,
* android.content.ContentValues, java.lang.String, java.lang.String[])
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// NOTE Argument checking code omitted. Check your parameters!
int updateCount = mDb.update(DATABASE_TABLE_NAME, values, selection, selectionArgs);
// Notify any listeners and return the updated row count.
getContext().getContentResolver().notifyChange(uri, null);
return updateCount;
}
}
配文件如下:
<provider android:name="TestContentProvider"
android:authorities="test">
</provider>
在客户端中可以使用如下方法进行调用:
ContentValues values = new ContentValues();
values.put(TestContentProvider.NAME, "testname1");
values.put(TestContentProvider.VALUE, "testvalu1e");
Uri newAddUri = TestActivity.this.getContentResolver().insert(TestContentProvider.CONTENT_URI, values);
Cursor c = TestActivity.this.managedQuery(newAddUri, new String[]{TestContentProvider.NAME}, null, null, null);
Log.i("TestActivity", "" + c.getCount());
if(c.moveToNext())
{
Log.i("TestActivity", c.getString(0));
}
上面的代码是先进行插入,然后进行查询并打印。就是如此简单,所有的应用如果需要都可以对外方便的提供数据接口,同时其他应用也可以很方便的进行调用。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android中ContentProvider和ContentResolver
# Android
# ContentProvider与ContentResolver详解
# Android 中自定义ContentProvider与ContentObserver的使用简单实例
# Android 中ContentProvider的实例详解
# Android ContentProvider实现获取手机联系人功能
# Android数据持久化之ContentProvider机制详解
# Android开发教程之ContentProvider数据存储
# android基础总结篇之八:创建及调用自己的ContentProvider
# Android学习笔记之ContentProvider和Uri详解
# 实例解析Android系统中的ContentProvider组件用法
# Android7.0中关于ContentProvider组件详解
# 也要
# 不需要
# 只需
# 希望能
# 要知道
# 可以使用
# 谢谢大家
# 很方便
# 就可以
# 不直接
# 不需要任何
# 客户端
# 几种方法
# 下午
# 文档
# 有相应
# ALL_MESSAGES
# Set
# matchers
# SPECIFIC_MESSAGE
相关文章:
如何在阿里云部署织梦网站?
如何用搬瓦工VPS快速搭建个人网站?
如何在七牛云存储上搭建网站并设置自定义域名?
,sp开头的版面叫什么?
如何通过虚拟机搭建网站?详细步骤解析
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
Python如何创建带属性的XML节点
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
如何在企业微信快速生成手机电脑官网?
如何制作算命网站,怎么注册算命网站?
,南京靠谱的征婚网站?
如何快速选择适合个人网站的云服务器配置?
网站制作模板下载什么软件,ppt模板免费下载网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
网站制作软件有哪些,制图软件有哪些?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
建站主机是什么?如何选择适合的建站主机?
制作表格网站有哪些,线上表格怎么弄?
如何零成本快速生成个人自助网站?
微信小程序 input输入框控件详解及实例(多种示例)
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何在IIS7中新建站点?详细步骤解析
如何选择靠谱的建站公司加盟品牌?
建站之星客服服务时间及联系方式如何?
Android自定义listview布局实现上拉加载下拉刷新功能
零基础网站服务器架设实战:轻量应用与域名解析配置指南
哈尔滨网站建设策划,哈尔滨电工证查询网站?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
网站制作公司排行榜,四大门户网站排名?
如何基于云服务器快速搭建网站及云盘系统?
如何彻底删除建站之星生成的Banner?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
建站主机默认首页配置指南:核心功能与访问路径优化
如何在西部数码注册域名并快速搭建网站?
如何在云主机快速搭建网站站点?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
电商平台网站制作流程,电商网站如何制作?
行程制作网站有哪些,第三方机票电子行程单怎么开?
广州商城建站系统开发成本与周期如何控制?
高端企业智能建站程序:SEO优化与响应式模板定制开发
Swift中循环语句中的转移语句 break 和 continue
IOS倒计时设置UIButton标题title的抖动问题
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
贸易公司网站制作流程,出口贸易网站设计怎么做?
seo网站制作优化,网站SEO优化步骤有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。