Android ContentProvider使用

 ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法。

ContentProvider完全屏蔽了底层数据源的数据存储方法。数据提供者通过ContentProvider提供了一组标准的数据操作接口,但却无须知道数据提供者的内部数据的存储方法。数据提供者可以使用SQLite数据库存储数据,也可以通过文件系统或SharedPreferences存储数据,甚至是使用网络存储的方法,这些数据的存储方法和存储设备对数据使用者都是不可见的。同时,也正是这种屏蔽模式,很大程度上简化了ContentProvider的使用方法,使用者只要调用ContentProvider提供的接口函数,即可完成所有的数据操作,而数据存储方法则是ContentProvider设计者需要考虑的问题。

规则

content://<authority>/<data_path>/<id>

content:// 是通用前缀,表示该UIR用于ContentProvider定位资源。

< authority > 是授权者名称,用来确定具体由哪一个ContentProvider提供资源。因此一般< authority >都由类的小写全称组成,以保证唯一性。

< data_path > 是数据路径,用来确定请求的是哪个数据集。如果ContentProvider近提供一个数据集,数据路径则可以省略;如果ContentProvider提供多个数据集,数据路径必须指明具体数据集。数据集的数据路径可以写成多段格式,例如people/girl和people/boy。

< id > 是数据编号,用来唯一确定数据集中的一条记录,匹配数据集中_ID字段的值。如果请求的数据不只一条,< id >可以省略。

简易demo如下:
先建立数据库用于简易储存
OpenHelper.java

package com.example.contentprovider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class OpenHelper extends SQLiteOpenHelper {
    public static String NAME="mydb.db";
    public static int version=1;


    public OpenHelper(Context context) {
        super(context, NAME, null, version);
        // TODO Auto-generated constructor stub
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql=("create table student (id integer primary key autoincrement,name varchar(64),adress varchar(64)");
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        // TODO Auto-generated method stub

    }

}

StudentProvider.java

package com.example.contentprovider;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

/*
 * 六个重载的函数
 * 1. onCreate() 一般用来初始化底层数据集和建立数据连接等工作 
 * 
 * 2.getType()
用来返回指定URI的MIME数据类型,若URI是单条数据,
则返回的MIME数据类型以vnd.android.cursor.item开头;
若URI是多条数据,则返回的MIME数据类型以vnd.android.cursor.dir/开头
   3.insert()、delete()、update()、query()  
   内部储存可以任何方法,数据库,SharedPreferences等都可以
 */

public class StudentProvider extends ContentProvider {
    private static final String TAG="StudentProvider";
    private OpenHelper oh;
    private static final int STUDENT=1;
    private static final int STUDENTS=2;
    private static final UriMatcher um=new UriMatcher(UriMatcher.NO_MATCH); 
    static{//规则
        um.addURI("com.example.contentprovider.StudentProvider", "student/#", STUDENT);
        um.addURI("com.example.contentprovider.StudentProvider","student", STUDENTS);
    }


    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // TODO Auto-generated method stub
        return 0;
    }
    //getType(Uri uri)方法 
    //用来返回指定URI的MIME数据类型,若URI是单条数据,
    //则返回的MIME数据类型以vnd.android.cursor.item开头;
    //若URI是多条数据,则返回的MIME数据类型以vnd.android.cursor.dir/开头
    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        int flag=um.match(uri);
        switch(flag){
        case STUDENT:
            return "vnd.android.cursor.item/student";
        case STUDENTS:
            return "vnd.android.cursor.dir/students";
        }
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        Uri resulturi=null;
        int flag=um.match(uri);
        switch(flag){
        case STUDENTS://本例使用数据库储存
            SQLiteDatabase db=oh.getWritableDatabase();
            long id=db.insert("student", null, values);
            resulturi=ContentUris.withAppendedId(uri, id);
            break;
        }
        Log.i(TAG, resulturi.toString());
        return resulturi;
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        oh=new OpenHelper(getContext());
        return false;
    }

    @Override
    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
            String arg4) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        return 0;
    }

}

外部调用:
MyTest.java

package com.example.contentprovider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.test.AndroidTestCase;

public class MyTest extends AndroidTestCase {
    public MyTest(){

    }
    public void insert(){
        ContentResolver contentResolver=getContext().getContentResolver();
        Uri url=Uri.parse("Content://com.example.contentprovider.StudentProvider/students");
        ContentValues values=new ContentValues();
        values.put("name", "张siw");
        values.put("adress", "北京");
        contentResolver.insert(url,values);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值