Android 内容提供者的实现

接着上文《Android 内容提供者简介》进一步实现内容提供者。

每个Content Provider类都使用URI(Universal Resource Identifier,通用资源标识符)作为独立的标识,格式如:content://com.example.app.provider/table1。其他应用程序通过不同的uri访问不同的内容提供者,并获取/操作里面的数据。

例如在本项目中对应如下URI:

content://com.wuyudong.db.personprovider/insert 添加的操作
content://com.wuyudong.db.personprovider/delete 删除的操作
content://com.wuyudong.db.personprovider/update 更新的操作
content://com.wuyudong.db.personprovider/query 查询的操作

在PersonDBProvider.java中添加代码:

package com.wuyudong.db;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonDBProvider extends ContentProvider {

    // 定义一个URI的匹配器用于匹配uri, 如果路径不满足条件 返回-1
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int INSERT = 1;
    private static final int DELETE = 2;
    private static final int UPDATE = 3;
    private static final int QUERY = 4;
    private PersonSQLiteOpenHelper helper; 

    static {
        // 添加一组匹配规则 com.wuyudong.db.personprovider
        matcher.addURI("com.wuyudong.db.personprovider", "insert",
                INSERT);
        matcher.addURI("com.wuyudong.db.personprovider", "delete",
                DELETE);
        matcher.addURI("com.wuyudong.db.personprovider", "update",
                UPDATE);
        matcher.addURI("com.wuyudong.db.personprovider", "query", QUERY);
    }

    @Override
    public boolean onCreate() {

        helper = new PersonSQLiteOpenHelper(getContext());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        if (matcher.match(uri) == QUERY) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
        }
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

}

新建一个名为other的项目,布局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:onClick="click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取DB的数据" />

</RelativeLayout>

点击下图的按钮,kill掉 com.wuyudong.db进程

点击Button按钮后,com.wuyudong.db进程重新运行,而且打印数据库中person表中的数据

进一步完善其他操作,修改布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:onClick="click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取DB的数据" />
     <Button
        android:onClick="delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除DB的数据" />
      <Button
        android:onClick="update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改DB的数据" />
       <Button
        android:onClick="insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加DB的数据" />

</LinearLayout>

接下来实现PersonDBProvider中的其他方法

package com.wuyudong.db;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonDBProvider extends ContentProvider {

    // 定义一个URI的匹配器用于匹配uri, 如果路径不满足条件 返回-1
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int INSERT = 1;
    private static final int DELETE = 2;
    private static final int UPDATE = 3;
    private static final int QUERY = 4;
    private PersonSQLiteOpenHelper helper;

    static {
        // 添加一组匹配规则 com.wuyudong.db.personprovider
        matcher.addURI("com.wuyudong.db.personprovider", "insert", INSERT);
        matcher.addURI("com.wuyudong.db.personprovider", "delete", DELETE);
        matcher.addURI("com.wuyudong.db.personprovider", "update", UPDATE);
        matcher.addURI("com.wuyudong.db.personprovider", "query", QUERY);
    }

    @Override
    public boolean onCreate() {

        helper = new PersonSQLiteOpenHelper(getContext());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        if (matcher.match(uri) == QUERY) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.query("person", projection, selection,
                    selectionArgs, null, null, sortOrder);
            return cursor;
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
        }
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        if (matcher.match(uri) == INSERT) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getWritableDatabase();
            db.insert("person", null, values);
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行插入操作");
        }
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        if (matcher.match(uri) == DELETE) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("person", selection, selectionArgs);
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行删除操作");
        }
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        if (matcher.match(uri) == UPDATE) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getWritableDatabase();
            db.update("person", values, selection, selectionArgs);
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行修改操作");
        }
        return 0;
    }

}
时间: 2024-10-11 00:20:35

Android 内容提供者的实现的相关文章

Android 内容提供者(ContentProvider)的简单实用

Android 中的数据库是对应用私有的,自己是无法使用别的应用的数据库的.但是往往有需求要我们使用另外一个应用或者系统应用的数据,这时候就彰显了内容提供者,ContentPrivider的作用,他就是两个应用数据的桥梁,通过内容提供者和内容接受者我们可以在不同应用间传递数据. ContentPrivider也可以视为一种数据存储.它存储数据的方式和使用它的应用程序无关,重要的是应用如何以一致的编程接口,来访问存储其中的数据.内容提供者与数据库的使用差不多,也可以增删改查.而且数据可以存储于数据

[android] 内容提供者简介

产生的原因是,当我们把数据存到数据库的时候,数据库的权限是私有的,把系统的短信应用中的数据库导出来,打开看到address字段是手机的号码,date字段是时间,type字段1,2代表发出去的短信和接受到的短信,body字段代表短信的数据.要想让别的应用程序访问自己数据库的数据,这时需要自己把数据给暴露出来. 新建一个类比如PersonProvider,先继承系统的ContentProvider类,这个类是android四大组件之一,暴露自己的私有数据,别的应用通过ContentResolver类

android内容提供者总结

35.内容提供者:ContentResolver 用内容提供者来获取联系人信息 35-1:权限 <!-- 对联系人的读.写权限 --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 35-2:新建实体类存放

Android内容提供者(Content provider)

使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 当应用需要通过ContentP

Android 内容观察者的原理

拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象,调用函数getContentResolver(), 调用ContentResolver对象的registerContentObserver(uri,notifyForDescendents,observer)方法,参数:Uri对象,是否精确uri(true不精确,false精确),observer

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

android 53 ContentProvider内容提供者

ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标准的方法而且不用知道音频文件在那个文件夹里面,只要设置条件就可以找到. 安卓系统把音视频.图片存在系统内部的数据库里面,ContentProvider操作的是数据库不是去文件夹里面去找.sd卡和内存卡的文件安卓系统都会登记,登记文件类型.路径,文件名,文件大小都保存在数据库里.ContentProv

Android四大基本组件(2)之Service 服务与Content Provider内容提供者

一.Service 服务: 一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序. 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器.在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲.然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的.在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从

Android 中内容提供者的使用

在Android中内容提供者主要是用于不同程序之间的数据共享.内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序的数据,另一种是创建自己的内容提供器,供其他的程序访问. 使用现有的内容提供器来读取和操作相应程序的数据 ContentResolve中提供了一系列的方法用于对数据进行增删改查的操作,其中,insert()用于添加数据,update()用于数据更新,delete()方法用于删除数据,query()用于数据的查询. 在ContentResolve中,使用内容URI