代码改变世界

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:         });

如上代码,在任何应用任何地方,执行以上代码,结果都是一样的,就是现实联系人列表,如下图:

device

我们创建的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: }
 

----------------------接下文----------------------------