您的位置:首页 > 移动开发 > Android开发

Android content provider

2012-11-05 16:31 387 查看
检索数据

1、content provider basics

2、检索content provider

3、修改content provider数据

4、创建自己的content provider

 

1、content provider basics

所有的content provider都会实现一个公共的接口

,可以实现对content provider的增删改查

在activity中需要通过接口函数getContentResolver()方法获取

ContentResolver 对象,

 

content provider数据模型

 

content provider的访问

通过content provider的Uri可以访问到数据集,掌管多个数据集(多个数据表)的content
provider为每个数据集都提供不同的Uri,所有的Uri都已content://开头,表明该数据由一个content
provider掌管。如果定义了一个contentprovider,那么一般要为该content provider的Uri定义一个常量,例如在android平台中为存储联系人电话号码和联系人图片的Uri常量CONTENT_URI,定义的常量值分别为

android.provider.Contacts.Phones.CONTENT_URI
 
android.provider.Contacts.Photos.CONTENT_URI


这两个
Uri
都被
 Contacts
content provider掌管


Uri常量也是 
ContentResolver
函数的第一个参数,指明需要访问的目标
provider
和目标
content
provider的哪个表,

 

2、检索content provider

检索provider需要的信息

              |---Uri(数据表)

              |---字段名

              |---字段的数据类型

如果指定查询行,需要改行的id

查询content provider可以使用下面两个函数

 
ContentResolver.query()


 
Activity.managedQuery()


这两个函数参数相同,而且都返回Cursor对象

managedQuery()
方法会使activity管理Cursor的生命周期

 

两个函数的参数

第一个参数:provider URI 

如果指定某一条记录,可以将该条记录的_id添加到Uri的后面,例如某条记录的id是123,那么该Uri是

content://. . . ./123

 

有两个助手函数

 
ContentUris.withAppendedId()
 和 
Uri.withAppendedPath()


可以实现在
Uri
后面添加
id


 


Both arestatic methods that return a Uri object with the ID added


// Use the ContentUris method to produce the base URI for the contact with _ID == 23.
Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI, 23);

// Alternatively, use the Uri method to produce the base URI.
// It takes a string rather than an integer.
Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI, "23");

// Then query for this specific record:
Cursor cur = managedQuery(myPerson, null, null, null, null);


第二个参数:

字段名:null代表所有字段,否则只会返回字段名指定的字段,android系统为其自己的

Content provider的字段名都提供了常量

第三个参数:

过滤条件:null代表返回所有

第四个参数: Selection arguments

第五个参数:指定返回数据的排序方式,null代表按照默认顺序返回,可能是无序的

一个完整例子

import android.provider.Contacts.People;
import android.database.Cursor;

// Form an array specifying which columns to return.
String[] projection = new String[] {
                             People._ID,
                             People._COUNT,
                             People.NAME,
                             People.NUMBER
                          };

// Get the base URI for the People table in the Contacts content provider.
Uri contacts =  People.CONTENT_URI;

// Make the query.
Cursor managedCursor = managedQuery(contacts,
                         projection, // Which columns to return
                         null,       // Which rows to return (all rows)
                         null,       // Selection arguments (none)
                         // Put the results in ascending order by name
                         People.NAME + " ASC");


返回的结果

读取返回的数据

返回的Cursor对象可能没有数据或者一行或者多行

如果想得到返回结果某行某个字段的值,必须知道该字段的数据类型,

However, for most types, if you call the methodfor reading strings, the Cursor object will give you the String representationof the data

因为返回的Cursor对象对不同的数据类型需要用不同的方法
getString()
getInt()
,
and 
getFloat()
.
读取,方法的参数为整型的字段索引,可以通过getColumnIndex函数根据字段名获得在返回结果中的索引,取得结果示例

import android.provider.Contacts.People;

private void getColumnData(Cursor cur){
    if (cur.moveToFirst()) {

        String name;
        String phoneNumber;
        int nameColumn = cur.getColumnIndex(People.NAME);
        int phoneColumn = cur.getColumnIndex(People.NUMBER);
        String imagePath;
   
        do {
            // Get the field values
            name = cur.getString(nameColumn);
            phoneNumber = cur.getString(phoneColumn);
           
            // Do something with the values.
            ...

        } while (cur.moveToNext());

    }
}


ModifyingData

Data kept by a content provider can be modified by:
Adding new records
Adding new values to existing records
Batch updating existing records
Deleting records
 

数据修改是通过ContentResolver中的方法,有时候某个 content
providers在写入数据比读取数据需要更严格的权限控制 ,如果没有对content
provider的操作权限,函数执行失败

 

 content providers 

主要分为两步:

       |---创建一个map集合对象 
ContentValues
,并将给该集合赋值,


    |--
调用
ContentResolver.insert()
 ,将content
provider的Uri和
ContentValues
集合对象传入,该函数返回插入记录的
Uri
,即包含了该插入行的
id
Uri


import android.provider.Contacts.People;
import android.content.ContentResolver;
import android.content.ContentValues;

ContentValues values = new ContentValues();

// Add Abraham Lincoln to contacts and make him a favorite.
values.put(People.NAME, "Abraham Lincoln");
// 1 = the new contact is added to favorites
// 0 = the new contact is not added to favorites
values.put(People.STARRED, 1);

Uri uri = getContentResolver().insert(People.CONTENT_URI, values);


 

 

Addingnew values to existing records
对于存在的一条记录,可以给该记录添加新的字段值或者之直接修改字段值,例如为人员记录添加email地址,修改phoneNumber
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: