Android开发——数据存储之ContentProvider(1)
2010-05-28 19:53 HalZhang 阅读(2571) 评论(1) 编辑 收藏 举报一、Android中四种数据存储方式
1、SharePreferences: 一种轻量级的数据存储方式,采用键值对的方式存储。最终还是以文件的方式存储。主要用了应用的配置,类型window中常见的*.ini文件。数据不共享,只能提供给一个应用使用。
2、SQLite:一个用于移动设备,小而强大的数据库。数据可以共享。
3、文件存储:就是文件操作咯。一般用了体积较大的文件,比如图片。
4、ContentProvider: 提供一种各个应用之间数据共享机制。以URI的形式提供访问地址。比如 content://contacts/people(有点REST的感觉) 可以访问系统中的联系人列表。这里的URI就可以用来构造Intent对象了。ContentProvider的数据存储是多种多样的,可以用数据库,文件,甚至是存放在网络的某个地方。
在Android中,注册一个ContentProvider,不单单是注册一个共享数据源,还包括数据源对应的Activity。所以Intent(action,Uri),由action和uri共同决定“目的地”。
示例代码一:
1: btn.setOnClickListener(new View.OnClickListener() {
2: public void onClick(View view) {
3: Log.d(TAG, "startActivityForResult");
4: Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people"));
5: startActivityForResult(i, PICK_REQUEST);
6: }
7: });
如上代码,在任何应用任何地方,执行以上代码,结果都是一样的,就是现实联系人列表,如下图:
我们创建的ContentProvider,是一个独立的类型,实际上跟Activity是没有关系的,跟应用也没有没有。一旦在某个应用的AndroidMainfest.xml进行配置,并将此应用安装到Android系统中,activity就和ContentProvider进行关联,而且这种关联是多对多的关联,所以切换Activity的时候时而有多个activity可以选择。
我不经意产生如下疑问有待解决:
系统如何管理ContentProvider(Uri),以及它们对应的应用(Activity)之间的关系呢?
二、创建一个ContentProvider
1、创建属性对象
示例代码二:
1: package com.halzhang.android.provider;
2:
3: import android.net.Uri;
4: import android.provider.BaseColumns;
5:
6: /**
7: * 属性对象
8: *
9: * @author 张汉国
10: */
11: public final class TodoList {
12:
13: public static final String AUTHORITY = "com.halzhang.android.provider.TodoList";
14:
15: private TodoList() {
16: }
17:
18: public static final class Todo implements BaseColumns {
19:
20: private Todo() {
21: }
22:
23: // content uri
24: public final static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/todos");
25:
26: // mime类型
27: public final static String CONTENT_TYPE = "vnd.halzhang.cursor.dir/com.halzhang.android.todo";
28:
29: // 单个数据的MIME类型在android中是有Uri和MIME来指定唯一一个Content的
30: public final static String CONTENT_ITEM_TYPE = "vnd.halzhang.cursor.item/com.halzhang.android.todo";
31:
32: // 默认的排序方式
33: public final static String DEFAULT_SORT_ORDER = "modified DESC";
34:
35: public final static String TITLE = "title";
36:
37: public final static String CONTENT = "content";
38:
39: public final static String CREATED_DATE = "created";
40:
41: public final static String MODIFIED_DATE = "modified";
42: }
43:
44: }
----------------------接下文----------------------------