赞
踩
思维导图:
一、什么是内容提供者?
ContentProvider(内容提供者)是android中的四大组件之一。ContentProvider为不同的软件之间数据共享,提供统一的接口。
ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数
据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。ContentProvider定义一
个对外开放的接口,从而使得其他的应用可以使用我们自己应用中的文件、数据库内存储的信息。实际开发过程中并不是很常用,
Android系统中的信息,图片库,联系人常用到,但谷歌工程师已经帮我封装好了,我们只需要访问即可。
二、为什么会有内容提供者?
内容提供者向其它的应用程序提供了一个数据访问的方式,这种方式相对于文件存储共享和sharedpreferences共享数据而言
的话,它提供了一个统一的数据访问方式,更方便更有效。
三、如何创建一个内容提供者?
首先:写一个类继承Contentprovider,重写六个方法如下实例所示
其次:在AndroidManifest.xml的<application>节点下配置<provider>指定name和authorities属性
实例:
- package com.sun.administrator.sqlite;
-
- import android.content.ContentProvider;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.net.Uri;
- import android.support.annotation.NonNull;
- import android.support.annotation.Nullable;
- import android.util.Log;
-
- import com.zking.db.DBHelper;
-
- /**
- * Created by Administrator on 2017/7/17 0017.
- */
-
- public class MyProvider extends ContentProvider {
- @Override
- public boolean onCreate() {
- Log.i("test","onCreate");
- return false;
- }
-
- @Nullable
- @Override
- public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
- Log.i("test","query");
-
- //把数据查询出来
- DBHelper dbHelper=new DBHelper(getContext(),"test.db",null,1);
- SQLiteDatabase sqLiteDatabase=dbHelper.getReadableDatabase();
- //sqLiteDatabase.rawQuery("select * from login",null);
- return sqLiteDatabase.rawQuery("select * from login",null);
- }
-
- @Nullable
- @Override
- public String getType(@NonNull Uri uri) {
- Log.i("test","getType");
- return null;
- }
-
- @Nullable
- @Override
- public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
- Log.i("test","insert");
- return null;
- }
-
- @Override
- public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
- Log.i("test","delete");
- return 0;
- }
-
- @Override
- public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
- Log.i("test","update");
- return 0;
- }
- }
- <!--配置内容提供者-->
- <provider
- android:authorities="com.sun.administrator.sqlite.LOGIN"
- android:name=".MyProvider"
- android:exported="true"
- ></provider>
第一步:安装访问的应用程序
第二步:获取解析器ContentResolver
第三步:通过解析器调取insert(), delete(), update(), query()方法访问Uri关联的ContentProvider
实例:
- package com.sun.administrator.contentresolver;
-
- import android.content.ContentResolver;
- import android.database.Cursor;
- import android.net.Uri;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
-
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- //获取上面一个应用程序的数据
- //获取内容访问者
- ContentResolver cr=getContentResolver();
- Uri uri=Uri.parse("content://com.sun.administrator.sqlite.LOGIN");
- Cursor cursor=cr.query(uri,null,null,null,null);
- while(cursor.moveToNext()){
- int uid=cursor.getInt(cursor.getColumnIndex("uid"));
- String uname=cursor.getString(cursor.getColumnIndex("uname")) ;
- String upass=cursor.getString(cursor.getColumnIndex("upass")) ;
- Log.i("test",uid+" "+uname+" "+upass);
- }
- }
- }
小结: ① ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法
② ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据
③ ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略
④ ContentProvider中可以注册观察者, 监听数据的变化
注意:1、配置信息中name 是完整的类名
2、authorities是访问Provider时的路径,一定要唯一
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。