内容提供者 ContentProvider

ContentProvider概念
– 内容提供者是Android中的四大组件之一;
– 为存储和获取数据提供统一的接口;
– 可以在不同的应用程序之间共享数据;

下面几段代码实现的是创建数据库DB及表account,通过ContentProvide向表中添加数据的小例子;

SQLiteOpenHelper:

public class DbHelper extends SQLiteOpenHelper
{

    public DbHelper(Context context) 
    {
        super(context, "DB", null, 1);   //创建数据库“DB”;
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        db.execSQL("create table account(id integer primary key, name text)"); //创建表account;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {

    }
}

SQLiteDatabase:

public class DbUtil
{
    DbHelper dbHelper;
    SQLiteDatabase db;
    public DbUtil(Context context) 
    {
        dbHelper = new DbHelper(context);
    }

    private void open()  //打开;
    {
        db = dbHelper.getWritableDatabase();
    }

    private void close() //关闭;
    {
        db.close();
    }

    public long insert(String table, ContentValues values)
    {
        open();
        long code = db.insert(table, null, values);  //向表table中插入数据values;
        close();
        return code;
    }

public void query(String table)
    {
        open();
        Cursor cursor = db.rawQuery("select * from account", null);
        while(cursor.moveToNext())
        {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            System.out.println("id=" + id + ",  name=" + name);
        }
        close();
    }
}

URI介绍
– 统一资源定位符,Universal Resource Identifier的简称;
–每一个ContentProvider都拥有一个公共的URI,这个URI用于表示所提供的ContentProvider的数据;
– Uri由以下三部分组成:“content://”、数据的路径、标识ID(可选);
– 每一个ContentProvider都拥有一个公共的URI,这个URI用于表示所提供的ContentProvider的数据;

UriMatcher类的介绍
– 用于操作Uri的工具类

UriMatcher类的主要方法
public void addURI (String authority, String path, int code)
注册所需的Uri
public int match (Uri uri) 与uri进行匹配

UriMatcher类的使用
– 初始化UriMatcher类
– 注册所需的Uri
– 与已经注册的Uri进行匹配

ContentProvider主要方法
boolean onCreate() ContentProvider创建后就执行
Uri insert(Uri uri, ContentValues values) 向ContentProvider添加数据
Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder) 从ContentProvider查询数据
int update(Uri uri, ContentValues values,String selection, String[] selectionArgs)从ContentProvider更新数据
int delete(Uri uri, String selection, String[] selectionArgs)
从ContentProvider删除数据

ContentProvider实现过程
– 定义CONTENT_URI常量
– 定义类继承ContentProvider
– 实现onCreate、insert、query、delete、update、getType方法
– 在清单文件AndroidManifest.xml中声明

自定义ContentProvider步骤
– 创建保存数据的文件或者数据库
– 定义类继承ContentProvider,实现抽象类
– 在清单文件AndroidManifest.xml中注册ContentProvider

public class MyContentValues extends ContentProvider
{
    DbUtil dbUtil;
    static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //urimatcher用于操作uri的工具类;
    final static String AUTHORITY = "com.lu.contentprovider";    //清单文件中的authorities属性值;
    final static int URI_ACCOUNT = 1;           //account表;
    static 
    {
        uriMatcher.addURI(AUTHORITY, "account", URI_ACCOUNT);  //注册所需的uri的code;
    }

    @Override
    public boolean onCreate() 
    {
        dbUtil = new DbUtil(getContext());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) 
    {       
        return null;
    }

    @Override
    public String getType(Uri uri) 
    {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) 
    {
        int code = uriMatcher.match(uri);    //match,与uri进行匹配;
        long l;
        switch(code)
        {
        case URI_ACCOUNT:
            l = dbUtil.insert("account", values);
            dbUtil.query("account");  //查询插入结果后的account表;
            break;
        }
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) 
    {       
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) 
    {
        return 0;
    }

}

添加系统ContentProvider内容步骤
– 通过getContentResolver获取ContentResolver对象
– 获取ContentResolver的URI标识
– 将添加的内容封装到ContentValues中
– 通ContentResolver对象调用insert方法执行添加操作

查询系统ContentProvider内容步骤
– 通过getContentResolver获取ContentResolver对象
– 获取ContentResolver的URI标识
– 列出想要查询的列
– ContentResolver对象调用query方法执行查询

public class MainActivity extends Activity implements OnClickListener
{
    Button user, customer;
    ContentResolver resolver;
    final static String CONTENT_URI = "content://com.lu.contentprovider/";
    String path = "data/data/com.lu.contentprovider/database/DB";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() 
    {
        user = (Button)findViewById(R.id.button1);
        customer = (Button)findViewById(R.id.button2);

        user.setOnClickListener(this);
        customer.setOnClickListener(this);

        resolver = getContentResolver();
    }

    @Override
    public void onClick(View v) 
    {
        switch(v.getId())
        {
        case R.id.button1:
            ContentValues values = new ContentValues();
            values.put("name", "account");
            resolver.insert(Uri.parse(CONTENT_URI + "account"), values);
            break;
        }
    }
}

在清单文件中注册:

<provider android:name="com.lu.contentprovider.MyContentValues"
         android:authorities="com.lu.contentprovider"
         android:exported="true" //true时,其它程序通过此扩展访问>
 </provider>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值