Android应用数据存储几种方式(3)
16lz
2021-01-23
(4)初识 ContentProvider
组成Android程序的主要4部分,它们分别是Activity,Broadcast Intent Receiver,Service,Content Provider.
Android这个系统和其它的操作系统还不太一样,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.难道两个程序之间就没有办法对于数据进行交换?解决这个问题主要靠ContentProvider.
一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型.也就是说,一个程序可以通过实现一个content Provider的抽象接口将自己的数据暴露出去.外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及到一些权限的问题.下边列举一些较常见的接口,这些接口如下所示:
什么是ContentResolver
外界的程序通过ContentResolver 接口可以访问ContentProvider 提供的数据,在Activity 当中通过getContentResolver()可以得到当前应用的ContentResolver 实例.ContentResolver 提供的接口和ContentProvider 中需要实现的接口对应, 主要有一下几个.
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):
//通过Uri 进行查询,返回一个Cursor
insert(Uri url, ContentValues values):
//将一组数据插入到Uri 指定的地方
update(Uri uri, ContentValues values, String where, String[] selectionArgs)
//更新Uri 指定位置的数据
delete(Uri url, String where, String[] selectionArgs)
//删除指定Uri 并且符合一定条件的数据
ContentProvider 和ContentResolver 中用到的Uri在ContentProvider 和ContentResolver 当中用到了Uri 的形式通常有两种,一种是指定全部数据,另一种是指定某个ID 的数据.我们看下面的例子:
content://contacts/people/
//这个 Uri 指定的就是全部的联系人数据
content://contacts/people/1
//这个 Uri 指定的是ID 为1 的联系人的数据
在上边两个类中用到的Uri 一般由3 部分组成
第一部分是:"content://".
第二部分是要获得数据的一个字符串片段.
最后就是ID(如果没有指定ID,那么表示返回全部).
由于 URI 经常比较长,而且有时候容易出错,且难以理解.所以,在Android 当中定义了一些辅助类,并且定义了 一些常量来代替这些长字符串的使用Contacts.People.CONTENT_URI(联系人的URI)
下面通过一个例子来演示:
组成Android程序的主要4部分,它们分别是Activity,Broadcast Intent Receiver,Service,Content Provider.
Android这个系统和其它的操作系统还不太一样,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.难道两个程序之间就没有办法对于数据进行交换?解决这个问题主要靠ContentProvider.
一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型.也就是说,一个程序可以通过实现一个content Provider的抽象接口将自己的数据暴露出去.外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及到一些权限的问题.下边列举一些较常见的接口,这些接口如下所示:
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder)://通过Uri 进行查询,返回一个Cursorinsert(Uri url, ContentValues values)://将一组数据插入到Uri 指定的地方update(Uri uri, ContentValues values, String where, String[] selectionArgs) //更新Uri 指定位置的数据.delete(Uri url, String where, String[] selectionArgs) //删除指定Uri 并且符合一定条件的数据
什么是ContentResolver
外界的程序通过ContentResolver 接口可以访问ContentProvider 提供的数据,在Activity 当中通过getContentResolver()可以得到当前应用的ContentResolver 实例.ContentResolver 提供的接口和ContentProvider 中需要实现的接口对应, 主要有一下几个.
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):
//通过Uri 进行查询,返回一个Cursor
insert(Uri url, ContentValues values):
//将一组数据插入到Uri 指定的地方
update(Uri uri, ContentValues values, String where, String[] selectionArgs)
//更新Uri 指定位置的数据
delete(Uri url, String where, String[] selectionArgs)
//删除指定Uri 并且符合一定条件的数据
ContentProvider 和ContentResolver 中用到的Uri在ContentProvider 和ContentResolver 当中用到了Uri 的形式通常有两种,一种是指定全部数据,另一种是指定某个ID 的数据.我们看下面的例子:
content://contacts/people/
//这个 Uri 指定的就是全部的联系人数据
content://contacts/people/1
//这个 Uri 指定的是ID 为1 的联系人的数据
在上边两个类中用到的Uri 一般由3 部分组成
第一部分是:"content://".
第二部分是要获得数据的一个字符串片段.
最后就是ID(如果没有指定ID,那么表示返回全部).
由于 URI 经常比较长,而且有时候容易出错,且难以理解.所以,在Android 当中定义了一些辅助类,并且定义了 一些常量来代替这些长字符串的使用Contacts.People.CONTENT_URI(联系人的URI)
下面通过一个例子来演示:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //得到应用的ContentResolver 实例 Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null); startManagingCursor(c); //我们将生成的Cursor 交给Activity 来管理,这样的好处是系统能自动做很多事情,比如当程序暂停的时候,这个系统可以卸载Cursor 以节省空间,当程序重新启动的时候系统重新查询生成Cursor. ListAdapter adapter = new SimpleCursorAdapter(this,Android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER },new int[] { Android.R.id.text1, Android.R.id.text2 }); setListAdapter(adapter); }
更多相关文章
- Android 下通过jni读取i2c数据
- Android动态刷新listview中的数据
- Android应用程序设置系统时间的方法
- android使用全局变量传递数据
- 如何使用 sqlite3 访问 Android 手机的数据库