Android学习笔记——Content Provider(一)

Content Provider是Android系统四大组件之一:android

官方的定义是:A Content Provider manages access to a central repository of data.数据库

那么Android系统为何要提供这样一个组件呢?安全

 

我的以为至少有以下两点:网络

首先,Android是一个很重视安全性的系统(貌似Android系统的漏洞最多~~~),一个应用的数据对于其余应用来讲私有的,除非你把数据存储在SD卡上。但不少时候咱们须要在程序之间共享数据,好比咱们想获取联系人的信息之类的。这时Content Provider就提供了一个很好的解决方案,将数据的存储、读取细节隐藏,提供一个统一的接口供其它应用访问,而且还能够作到权限控制,在必定程度上保证数据的安全性。ide

其次就是进程间通讯(inter-process communication IPC)的问题,若是让开发者本身来处理这些细节无疑会加大开发的难度。而Content Provider提供了相似于b/s结构的模式,b与c之间是以一种什么方式去实现咱们并不关心,就像咱们大部分时候不用去关心网络究竟是怎么链接的。开发者应该关心的是怎么去实现一个Content Provider或去调用一个Content Provider。ui

 

URI(Uniform Resource Identifier)统一资源标识符spa

URI和URL(Unifrom Resource Locator)很像,但二者并非同一个东西,不过能够拿来作类推。翻译

对于一个content URI的通常形式是这样子的:code

content://user_dictionary/words

 

其中“content://”称为scheme,相似于http://或ftp://,表示这个URI的类型。orm

“user_dictionary”就相似于域名,但在这里应该叫作authority(这个怎么翻译呢?)。它是一个用来标识不一样content provider的名称。

“words”这里用于表示对哪个表进行操做。注意,这里这么说是不许确的!

首先content provider的数据源不必定就是关系型数据库,能够是xml,数据文件甚至是网络数据。

其次,就算是SQLite之类的数据库,这一部分也不必定就真的是一个真实存在的表,它可能就是某个视图而已,这里说它是某一个表只是方便理解,切记!

 

如何建立一个Uri呢?

第一种:能够用Uri.Builder来建立:

Uri.Builder builder = new Uri.Builder();

builder.scheme("content");

builder.authority("user_dictionary");

builder.path("words");

Uri uri = builder.build();

还有一种更简单的方法,就是使用Uri.Parse()方法:

Uri uri = Uri.parse("content://user_dictionary/words");

显然,第二种要简洁得多了。

 

有些content provider支持直接查询到某一条记录,就是在上面提到Uri的末尾再加上一个id如:

content://user_dictionary/words/2

就表示直接定位到某一个记录上。构建这种Uri有一个简单的方法

Uri uri = Uri.parse("content://user_dictionary/words");

Uri singleUri = ContentUris.withAppendedId(uri, 4);

从content provider中检索数据:

使用一个content provider主要有以下几个步骤:

 

在AndroidManifest.xml文件中添加相应的权限。

如,想要查看系统的通话记录应该添加

<uses-permission android:name="android.permission.READ_CALL_LOG" />

要注意,content provider读写权限是分开的,读就只能读,写就只能写(不像写外部存储卡那个权限,它其实还含有读的权限)。好比同时还要修改通话记录的话,还应该添加这个权限:

<uses-permission android:name="android.permission.WRITE_CALL_LOG" />

使用ContentResolver的query方法。该方法的签名是这样的:

public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 

若是比较熟悉SQLite的应该对这些参数至关熟悉。不就是把一个SQL语句分红几个部分嘛。

这个方法将返回一个Cursor,经过这个“游标”咱们就能够获得咱们想要的数据了。

下面给一个获取通话记录的例子:

 

    public void getData() {
        
        String[] projection = {
            Calls.NUMBER,
            Calls.DATE,
            Calls.DURATION,
            Calls.TYPE
        };
        Cursor cursor = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, null);
        while (cursor.moveToNext()) {
            for (int i = 0; i < cursor.getColumnCount(); i++) {
                System.out.println(cursor.getColumnName(i) + "--->" + cursor.getString(i));
            }
            System.out.println("~~~~~~~~~~~~~~~~");
        }
        cursor.close();
    }

其余方法其实也都是差很少的,看看文档能够掌握了,若是还以为比较难懂,建议先学一下SQLite的使用。

相关文章
相关标签/搜索