Android中content provider提供了一种进程间共享数据的机制。Conetent provider以类似数据库表的机制提供与外部交互的方法。content provider的实现并不对存储形式做要求,可以是数据库、文件、或者网络。要自己编写一个content provider需要注意的事项包括(from official reference):
1、派生ContentProvider类,实现若干个接口,主要包括:onCreate/query/update/delete/insert/getType;
2、定义好一系列的URI,URI用于指示访问的具体数据,一般可以配合UriMatcher来简化对URI的处理,其大致框架为:
public MyContentProvider extends ContentProvider {
private static final UriMatcher sURLMatcher =
new UriMatcher(UriMatcher.NO_MATCH);
static {
sURLMatcher.addURI("sms", null, SMS_ALL);
sURLMatcher.addURI("sms", "#", SMS_ALL_ID);
sURLMatcher.addURI("sms", "inbox", SMS_INBOX);
sURLMatcher.addURI("sms", "inbox/#", SMS_INBOX_ID);
}
}
....
@Override
public Cursor query(Uri url, String[] projectionIn, String selection,
String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
// Generate the body of the query.
int match = sURLMatcher.match(url);
switch (match) {
case SMS_ALL:
constructQueryForBox(qb, Sms.MESSAGE_TYPE_ALL);
break;
case SMS_UNDELIVERED:
UriMatch中包含2个通配符:#用于匹配数字、*用于任何字符。
3、还是关于URI,URI分为三部分:content/authority/subpath,authority非常重要,它除了有效地区分URI外,还用于在AndroidManifest.xml中注册content provider。
4、在AndroidManifest.xml中注册content provider:
<provider name=".TransportationProvider" authorities="com.example.transportationprovider" . . . >
5、实现getType,为数据标识MIME,这个可以使用统一的形式:
vnd.android.cursor.item/vnd.yourcompanyname.contenttype
vnd.android.cursor.dir/vnd.yourcompanyname.contenttype
分别表示单个数据和多个数据,这里的yourcompanyname可以使用之前URI中的authority字符串。
6、当然,为了方便使用者使用,最好在content provider中预先定义好各种列名、以及CONTENT_URI。
1.5.2011 update
昨天写了个例子,使用数据库做存储。基本上,写一个简单可用的content provider比较简单:
1、派生SQLiteOpenHelper,在onCreate里创建所需要的表;在onUpgrade里面一般先删了整张表,然后再重新创建:
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + BLACKLIST_TABLE_NAME + " ("
+ BlackList._ID + " INTEGER PRIMARY KEY,"
+ BlackList.ADDRESS + " TEXT,"
+ BlackList.TYPE + " INTEGER,"
+ BlackList.DATE + " INTEGER"
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + BLACKLIST_TABLE_NAME);
onCreate(db);
}
}
然后在content provider的onCreate里创建该对象:
@Override
public boolean onCreate() {
mOpenHelper = new DatabaseHelper(getContext());
return true;
}
2、实现了content provider后,会有个文件定义了诸如该content provider的URI,各个列的名字,或者其他信息;这个文件并非必须,
使用者可以自己定义这些URI来使用,例如content://sms
3、content provider编写好后,可以像一般的程序一样安装到系统里面,虽然它没界面;然后使用者就可以使用之。
例子见附件
分享到:
相关推荐
11.6.1 编写Content Provider 269 11.6.2 在不同的应用中调用Content Provider 277 11.6.3 重构Content Provider调用 278 本章小结 281 第12章 多媒体 282 12.1 多媒体文件介绍 282 12.1.1 音频多媒体文件介绍...
ContentProviderCodeGenerator, 创建Android内容源的代码生成器 DatabaseCodeGenerator这个项目是用Java编写的代码生成器,用于生成Android代码。 如果给定了数据库模式JSON定义文件,那么将生成在项目中添加相应...
10.4 Content Provider组件的数据更新通知机制 10.4.1 注册内容观察者 10.4.2 发送数据更新通知 第11章 Zygote和System进程的启动过程 11.1 Zygote进程的启动脚本 11.2 Zygote进程的启动过程 11.3 ...
10.4 Content Provider组件的数据更新通知机制 10.4.1 注册内容观察者 10.4.2 发送数据更新通知 第11章 Zygote和System进程的启动过程 11.1 Zygote进程的启动脚本 11.2 Zygote进程的启动过程 11.3 System进程...
6.4.4 Content Provider更新的通知机制 267 6.4.5 DAO接口及实现 269 6.4.6 在新线程内处理数据 270 6.5 小结 273 第7章 移动多媒体编程 274 7.1 多媒体文件格式与编码 274 7.1.1 多媒体文件格式 274 7.1.2 编码 275...
dc_ass_extensions.py:dc_ass 的一些基本扩展,提供有用的功能,并作为如何编写自定义扩展的示例。 dc_debug.py:DontCamp.com BF2 Python 脚本的通用调试日志库。 dc_irs.py(DontcCamp.com 游戏内报告系统):一...
第8章 数据库和Content Provider 第9章 在后台操作 第10章 扩展用户体验 第11章 高级用户体验 第12章 硬件传感器 第13章 地图、地理编码和基于位置的服务 第14章 个性化主屏幕 第15章 音频、视频以及摄像头的使用
这里面是自己创建的一个SQLITE实例,向外提供的contentprovider的接口来使用,大家可以学习学习哦。
第一周项目:Android上的Kotlin 这是挑战中的,显示了在构建Android应用程序中... 我用Kotlin而不是Java编写了Content Provider,Cursor Adapter和Activity。 唯一的Java文件是默认测试文件,由Android Studio自动创建
由全球做推荐系统的研究人员参与编写。目录主干: 1 Introduction to Recommender Systems Handbook Part I Basic Techniques 2 Data Mining Methods for Recommender Systems 3 Content-based Recommender Systems...
UlboraCMS是用Golang编写的自包含CMS(无需数据库)。 它使用JSON数据存储,其内容保存在json文件和内存中。 您可以根据需要下载和上载包含内容,图像和模板的单个二进制备份文件。 Docker容器 获得Ulbora CMS的最...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
2.3.1 硬件抽象层模块编写规范............................... 26 2.3.2 编写硬件抽象层模块接口............................... 29 2.3.3 硬件抽象层模块的加载过程........................... 33 2.3.4 ...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...