分析Content Providers用法
前面我们在“Android应用程序剖析”中讨论过Android平台上四种存储数据的方法以及需要着重注意的特性。Content Providers是Android提供的一种让我们能够在不同应用间共享数据 的唯一的 通用化接口机制,通过对底层的数据源进行抽象,Content Providers 解除了应用程序层和数据层的耦合,这样应用程序可以轻便的在不同数据源之上切换(和DAO的理想相当一致),Content Providers使用 权限控制,通过URI模式访问,读写双向,由此,任何具有对应permissions(许可、权限)的应用程序都可以增删查改 由另一个程序创建的数据---包括一些本地化Android数据库(也就是说你的程序可以访问通讯录,浏览器历史等),同样,你可以把你自己的数据源发布成Content Providers,这样其他开发者就可以和你所开发的应用中的数据进行交互,甚至扩展。
为什么需要Content Provider?
因为在Android平台上文件都是应用程序私有的,也就是应用程序只能访问自己的文件,如果是属于其它应用程序的文件,一般式无法直接访问的。如果需要共享数据,那么我们就需要content provider,简单的说就是用content provider把数据包装后供授权的Application访问。
什么是Content Provider?
Content Provider实际上是一个类,这个类将它要共享的数据进行包装,提供了一组供其它应用程序调用的接口方法,这些方法可以让应用程序存储和提取被包装的数据。
创建Content Providers 步骤有哪些?
继承ContentProvider,重写onCreate,update,query,insert,delete,getType回调方法,当应用程序用ContentResolver.insert()等操作时,此处的函数被调用定义public static final Uri CONTENT_URI属性,此变量代表你的ContentProvider能够处理的 URI,必须是唯一的,(实际是引用AndroidManifest.xml中的定义),
构建数据存储系统,我们可以使用文件存储或是SQLite数据库,或其他
针对SQLite3,我们的步骤如下:
1、定义内部类继承SQLiteOpenHelper,并重写onCreate(SQLiteDatabase db)和 onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)方法.
2、对于query(),我们在其内部依赖Cursor SQLiteQueryBuilder.Query()发送查询,对于其他insert,update,delete我们直接借助SQLiteDatabase.insert等完成
3、在Content Provider的onCreate()中,我们做如下初始化
1 Context context = getContext();
2
3 DatabaseHelper dbHelper;
4
5 dbHelper = new DatabaseHelper(context, DATABASE_NAME, null,DATABASE_VERSION);
6
7 DB = dbHelper.getWritableDatabase();
8
9 return (DB == null) ? false : true;
定义我们的查询时所会用到的列名,一般我们会把数据库中表的所有列名都定义成常量,方便查询时Cursor提取值。
// Column Names 表中列名
public static final String KEY_ID = "_id";
public static final String KEY_DATE = "date";
public static final String KEY_DETAILS = "details";
public static final String KEY_LOCATION_LAT = "latitude";
URI数据请求来了,作为Content Provider的开发者你需要告诉Conent Provider怎么判断URI想要哪种数据,这里需借助UriMatcher。
private static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
.......
}