个人参考——android之内容提供器provider

android四大组件:activity,receivor,service,provider。
个人觉得provider自己开发用的比较少,不过查看其他程序的内容倒是挺多,因此难免忘的比较快,本文只提供简单的提示,主要为了方便查看。

安卓自身集成了了一个ContentProvider类,开发的程序若要实现内容提供的功能,就得继承这个类,然后重写各个操作数据库的方法。具体代码如下:

DiaryContentProvider.java文件

public class DiaryContentProvider extends ContentProvider {
//自己定义的类,继承ContentProvider,重写外面应用查询数据库的方法
    static String AUTHORITY="com.diary.provider";
    //权限,在AndroidManifest中声明,name中写入具体类全名,authority写入权限(就是个字符串)。
    static int QUERY=0;
    static int QUERYITEM=1;
    static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
    static {
        matcher.addURI(AUTHORITY,"diary",QUERY);
        matcher.addURI(AUTHORITY,"diary/#",QUERYITEM);
    }
    //uri只有与上面两种匹配,才可以进行数据操作。
    SQLiteDatabase db;
    public DiaryContentProvider() {
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // Implement this to handle requests to delete one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }//重写delete方法,外部应用进行删除操作时会调用该方法。

    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        if(matcher.match(uri)==QUERY){
            return "vnd.android.cursor.dir/vnd.com.example.app.provider.diary";
        }else if(matcher.match(uri)==QUERYITEM){
            return "vnd.android.cursor.item/vnd.com.example.app.provider.diary";
        }else{
            throw new UnsupportedOperationException("Not yet implemented");
        }
    }//获取返回MIME类型字符串,这个方法需要重写,返回格式为vnd.android.cursor.dir(或者item)+"/vnd."+权限+"."+路径。

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO: Implement this to handle requests to insert a new row.
        throw new UnsupportedOperationException("Not yet implemented");
    }//重写insert方法

    @Override
    public boolean onCreate() {
        // TODO: Implement this to initialize your content provider on startup.
        db=new MySQLOpenHelper(getContext(),"diary",null,1).getWritableDatabase();
        //要操作数据库必须得新建类继承SQLOpenHelper,重写其中的onCreate等方法,表示第一次调用数据库时采取的操作。通过getWritableDatebase可以获取一个可以操作数据库的对象db。
        return true;
    }//当有外部应用调用该provider获取内容时会调用onCreate,这里主要是与数据库连接起来,用以操作数据。

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        // TODO: Implement this to handle query requests from clients.
        Cursor cursor=null;
        if(matcher.match(uri)==QUERYITEM){
        //match返回值是一个int型,即在开始addURI时第二个参数。
            cursor=db.query("diary",null,"id=?",new String[]{uri.getPathSegments().get(1)},null,null,null,null);
            // Uri 对象的getPathSegments()方法,它会将内容 URI 权限之后的部分以“/”符号进行分割,并把分割后的结果放入到一个字符串列表中,那这个列表的第 0 个位置存放的就是路径,第 1 个位置存放的就是id 
        }else if(matcher.match(uri)==QUERY){
            cursor=db.query("diary",null,null,null,null,null,null,null);
        }
        return cursor;
    }//重写query方法。

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO: Implement this to handle requests to update one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }//重写update方法
}

AndroidManifest.xml中配置

 <provider
       android:authorities="com.diary.provider"    
       android:name="com.diary.DiaryContentProvider"/>
       //name中为具体类名

MySQLOpenHelper.java文件

public class MySQLOpenHelper extends SQLiteOpenHelper {
    final String CREATE_DIARY="create table diary(" +
            "id integer primary key autoincrement," +
            "date text," +
            "time text," +
            "title text," +
            "information text," +
            "authority integer)";
    public MySQLOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);

    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_DIARY);
        //对象第一次调用getWritableDatabase()时若是没有对应数据库,则会先调用onCreate。
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库更新时调用
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值