ContentProvider(一)

注册ContentProvider:

<provider
    android:name=".provider.UserProvider"
    android:authorities="com.rw.contentprovider.provider.UserProvider"
    android:exported="true"
    ></provider>

其中authorities是URI中的域名部分,可以随便取,但必须在整个系统中唯一

      name和ACtivity一样,告诉虚拟机与之绑定的class

       exported指定ContentProvider是否允许被其他应用调用

继承ContentProvider的以下5个方法:

可以根据自己的业务需求,实现相应的方法

以下是自己写的demo,有之前写的DBOpenHelper类的支持

public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {

        SQLiteDatabase dataBase= this.userDatabase.getReadableDatabase();
        switch (USERMATCHER.match(uri)) {
        case USER:
            long rawId= ContentUris.parseId(uri);
            String where="uid="+rawId;
            if(selection!=null){
                where+=" and "+selection;
            }
            return dataBase.query("users", projection, where, selectionArgs, null, null,sortOrder);

        case USERS:
            return dataBase.query("users", projection, selection, selectionArgs, null,null, sortOrder);
        default:
            throw new IllegalArgumentException("this unknown Uri:"+uri.toString());

        }
    }
public String getType(Uri uri) {
        switch (USERMATCHER.match(uri)) {
        case USER:
            return "vnd.android.cursor.dir/user";
        case USERS:
            return "vnd.android.cursor.item/user";    

        default:

            throw new IllegalArgumentException("this is unknown Uri:"+uri.toString());
        }
    }
public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();
        switch (USERMATCHER.match(uri)) {
        case USER:

            throw new IllegalArgumentException("this Uri can not insert a record to Content!");

        case USERS:
            long rawId=dataBase.insert("users", null, values);

            return ContentUris.withAppendedId(uri, rawId);
        default:

            throw new IllegalArgumentException("this unknown Uri:"+uri.toString());
        }
    }
public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase dataBase= this.userDatabase.getWritableDatabase();
        switch (USERMATCHER.match(uri)) {
        case USER:
            long rawId= ContentUris.parseId(uri);
            String where="uid="+rawId;
            if(selection!=null){
                where+=" and "+selection;
            }
            return dataBase.delete("users", where, selectionArgs);
        case USERS:

            return dataBase.delete("users", selection, selectionArgs);
        default:

            throw new IllegalArgumentException("this unknown Uri:"+uri.toString());
        }
    }
public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        SQLiteDatabase dataBase=userDatabase.getWritableDatabase();
        switch (USERMATCHER.match(uri)) {
        case USER:
            long rawId= ContentUris.parseId(uri);
            String where="uid="+rawId;
            if(selection!=null){
                where+=" and "+selection;
            }
            return dataBase.update("users", values, where, selectionArgs);
        case USERS:
            if(selection!=null){
                return dataBase.update("users", values, selection, selectionArgs);
            }else{
                throw new IllegalArgumentException("this Uri con not update record from dataBase");
            }
        default:

            throw new IllegalArgumentException("this Uri is unknown:"+uri.toString());
        }
    }

在使用者使用ContentResolver对数据进行CURD操作时,分别调用了与之对应的的方法,其实其底层也是根据URI获取到了这个ContentProvider,进而将参数传递给ContentProvider中与之对应的方法。以下是其中一类的Code

public final int update(Uri uri, ContentValues values, String where,
            String[] selectionArgs) {        //在这里根据传入的Uri,获取到一个ContentProvider
        IContentProvider provider = acquireProvider(uri);
        if (provider == null) {
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
        try {
            long startTime = SystemClock.uptimeMillis();            //在这里真正执行ContentProvider的update方法
            int rowsUpdated = provider.update(mPackageName, uri, values, where, selectionArgs);
            long durationMillis = SystemClock.uptimeMillis() - startTime;
            maybeLogUpdateToEventLog(durationMillis, uri, "update", where);
            return rowsUpdated;
        } catch (RemoteException e) {
            // Arbitrary and not worth documenting, as Activity
            // Manager will kill this process shortly anyway.
            return -1;
        } finally {
            releaseProvider(provider);
        }
    }

时间: 2024-10-26 18:49:46

ContentProvider(一)的相关文章

四大组件之ContentProvider小结

总结提高,与君共勉 1.什么是Content Provider Content Provider维护特定的应用数据,并可以让其它应用轻松访问该数据.对数据使用者来说它是数据提供者.它提供统一的接口对数据进行操作,使用者不用关心数据到底是如何存储的以及数据类型到底是什么.也就是说,Content Provider作为数据提供者,提供了对外共享本地数据一种机制,使Android应用能方便地基于该机制进行数据访问.为了便于管理和访问,每个Content Provider必须有唯一标示,用Uri表示.U

ContentProvider

android使用一种称为contentprovider的概念来将数据抽象为服务. 这种内容提供给程序的理念看起来像是启用了REST的数据提供程序.REST(REpresentational State Transfer具象状态传输),它是一种设计风格,通常基于使用HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准.资源由URI指定,对资源的操作包括获取,创建,修改和删除资源:这些操作正好对应HTTP协议提供的GET,POST和DELETE方法. 要从ContentProvide

关于ContentProvider的一些例子(获取联系人)

ContentResolver:是Android的四大组件之一,主要用于对外共享数据. Android提供了一些主要数据类型的ContentProvider,比如音频.视频.图片和私人通讯录等.前提是已经获取其权限. 主要方法 public boolean onCreate() 在创建ContentProvider时调用public Cursor query(Uri, String[], String, String[], String) 查询ContentProvider,返回一个Cursor

安卓中的数据存储方式以及ContentProvider的简单介绍

1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储 2.请介绍下ContentProvider是如何实现数据共享的 安卓中如果想将自己应用程序的数据暴露给其他的应用程序的时候就需要创建内容提供者.第三方可以通过contentResolver来访问该provider 3.为什么要使用ContentProvider?它和sql的实现上有什么差别? ContentProvider屏蔽了数据

[Android] ContentProvider实例详解

1.ContentProvider是什么? ContentProvider(内容提供者)是Android的四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用. Android的数据存储方式总共有五种,分别是:Shared Preferences.网络存储.文件存储.外储存储.SQLite.但一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,就会用到Cont

android 53 ContentProvider内容提供者

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

用自定义ContentProvider实现对数据库的增、删、改、查操作

本次对于数据库的操作是在不同的APP中进行的.下面的前四篇是在一个APP中,后面的是在另一个APP中 ------------------------------------------------------------------------------------------------- 首先自定义一个SqliteOpenHelper.完成对数据库的创建和数据库内table的创建 package com.example.content_provider_03; import androi

Android(java)学习笔记245:ContentProvider之银行数据库创建和增删改查的实现

1.Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentProvider  内容提供者 2. ContentProvider  内容提供者 用途:把应用程序私有的数据暴露给别的应用程序. 3.下面通过一个银行数据库创建和增删改查的实现案例说明ContentProvider的使用: (1)首先我们这里要用到数据库,首先我们必须先扩展一个抽象类SQLiteOpenH

ContentProvider中的数据生成时机

MainActivity.java 1 package com.wyl.contentprovidermine; 2 3 4 import android.app.Activity; 5 import android.content.ContentResolver; 6 import android.content.ContentValues; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.vie

android,ContentProvider+ContentObserver+ContentResolver,用法。

这个是传智播客老师讲android开发时的一个图. 一. PersonProvider继承ContentProvider,实现ContentProvider中的数据操作类. 在需要监听的操作中添加添加数据变化通知. this.getContext().getContentResolver().notifyChange(uri, null); 第二个参数,数据变化的监听者,可以不设置,也即是设为null,如果给定了这个监听者,不管外面有多少个应用要设置监听,进行监听数据变化,这个getConten