Android:内容提供者(ContentProvider)和内容访问者(ContentResolver)

    ContentProvider(内容提供者)是Android四大基本组件之一。用来共享应用程序内的数据;当你需要把你应用程序的数据提供给其他应用程序时需要用到它;内容访问者(ContentResolver)通过应用程序来访问内容提供者(ContentProvider)的方法,一旦通过ContentProvider提供自己的数据,不管应用程序是否启动,都可以访问得到。

(1)、ContentProvider的原理:按照一定规则暴露自己的接口给其他应用程序来访问自己应用程序的数据(其实就是自定义增删改查接口并提供出去,让其他应用程序访问自己的数据)。

(2)、ContentResolver的原理:按照一点规则访问ContentProvider的数据(其实就是调用ContentProvider自定义的接口来操作它的数据)。

1、首先我们新建一个demo,通过创建自己的ContentProvider来实现应用程序之间的数据共享。新建一个类(MyProvider.java)继承ContentProvider,重写它的6个方法。代码如下:

public class MyProvider extends ContentProvider{

    private SQLiteDatabase sqLiteDatabase;

    @Override
    public boolean onCreate() {
        DBhelper dBhelper=new DBhelper(getContext(), "question.db",null,1);
        sqLiteDatabase = dBhelper.getReadableDatabase();
        Log.i("test", "onCreate: 1");
        return false;
    }
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        //查询所有的数据
        Log.i("test", "query: 2");
        return sqLiteDatabase.rawQuery("select * from questions",null);
    }
    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.i("test", "getType: 3");
        return null;
    }
    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.i("test", "insert: 4");
        return null;
    }
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.i("test", "delete: 5");
        return 0;
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.i("test", "update: 6");
        return 0;
    }
}

2、在清单文件(AndroidManifest.xml)中配置ContentProvider。代码如下:

  <!--配置内容提供者-->
        <provider
            android:authorities="com.example.administrator.android_contentprovider.person"
            android:name="com.example.administrator.provider.MyProvider"
            android:exported="true"
            >
        </provider>
4、创建 ContentResolver的demo来访问ContentProvider的数据。在demo中的布局文件中写一个Button控件,在主activity(MainActivity.java)中写它访问数据的方法。代码如下:

public class MainActivity extends AppCompatActivity {

    private ContentResolver contentResolver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取内容访问者
        contentResolver = getContentResolver();
    }
    //按钮点击事件
    public void getData(View view){
        Uri  uri = Uri.parse("content://com.example.administrator.android_contentprovider.person");
        Cursor cursor= contentResolver.query(uri,null,null,null,null);
        while(cursor.moveToNext()){
          int id=cursor.getInt(cursor.getColumnIndex("_id"));
          String title=cursor.getString(cursor.getColumnIndex("content"));
          Log.i("test",id+ "getData: "+title+" ");
      }
    }
}

然后在控制台下会打印你访问的所有数据。

ContentProvider类主要方法的作用:

1>public boolean onCreate()--
该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。
2>public Uri insert(Uri uri, ContentValues values)--
该方法用于供外部应用往ContentProvider添加数据。
3>public int delete(Uri uri, String selection, String[] selectionArgs)--
该方法用于供外部应用从ContentProvider删除数据。
4>public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)--
该方法用于供外部应用更新ContentProvider中的数据。
5>public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)--
该方法用于供外部应用从ContentProvider中获取数据。
6>public String getType(Uri uri)--
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,

例如:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。


Uri代表了要操作的数据,Uri主要包含了两部分信息:

1>需要操作的数据路径ContentProvider ,

2>对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://。
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个例子,演示了如何使用Java访问者模式: 首先,定义一个访问者接口,该接口定义了访问者在不同元素上执行的操作: ```java public interface Visitor { void visit(ElementA elementA); void visit(ElementB elementB); } ``` 接下来,定义元素接口,该接口定义了元素接受访问者的方法: ```java public interface Element { void accept(Visitor visitor); } ``` 然后,实现具体的元素,这里有两个元素A和B: ```java public class ElementA implements Element { @Override public void accept(Visitor visitor) { visitor.visit(this); } public void operationA() { System.out.println("执行操作A"); } } public class ElementB implements Element { @Override public void accept(Visitor visitor) { visitor.visit(this); } public void operationB() { System.out.println("执行操作B"); } } ``` 最后,实现具体的访问者,该访问者在访问元素时执行特定的操作: ```java public class ConcreteVisitor implements Visitor { @Override public void visit(ElementA elementA) { elementA.operationA(); } @Override public void visit(ElementB elementB) { elementB.operationB(); } } ``` 现在,我们可以使用访问者模式来处理元素的集合。例如,我们可以定义一个元素列表,并且使用访问者来访问每个元素: ```java List<Element> elements = Arrays.asList(new ElementA(), new ElementB()); Visitor visitor = new ConcreteVisitor(); for (Element element : elements) { element.accept(visitor); } ``` 这将输出以下内容: ``` 执行操作A 执行操作B ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值