内容提供者ContentProvider 初解

  1. 内容提供者 ContentProvider

2.作用:

应用的数据库是不允许其他应用访问的,内容提供者的作用就是让别的应用访问到你的数据库。

其是存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据(不同的进程中实现数据共享);
  1. 特点:

    Android四大组件之一,需要在 清单文件AndroidManifest.xml中进行注册

  2. 注意事项:
    Uri : 自定义的 内容提供者 其主机名 为内容提供者的主机名 authorities,其一般为内容提供者的包名;后面带的数据为表名称eg.”/people”。
    Uri uri = Uri.parse(“content://com.example.android3_providecontent_demo2/people”);

    系统定义的Uri:
    MediaStore.Video.Media.EXTERNAL_CONTENT_URI //存储在手机外部存储器上的视频文件的内容的ContentProvider的URI
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI //存储在手机外部存储器上的音频文件的内容的ContentProvider的URI
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI //存储在手机外部存储器上的图片文件的内容ContentProvider的Uri
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI //ContentProvider读取电话号码的Uri
    ContactsContract.Contacts.CONTENT_URI //ContentProvider读取联系人的Uri

  3. 步骤:

    5.1:在AndroidManifest.xml文件注册

    <provider
        android:name="com.example.android3_providecontent_demo2.MyContentProvider"   //全类名
        android:authorities="com.example.android3_providecontent_demo2"     //主机名:标示具体为哪一个内容提供者  配置内容提供者的时候,设置访问uri的属性是
        android:exported="true" >                           //表示数据是否能导出
    </provider>
    

    5.2 继承ContentProvider,实现增(insert)、删(delete)、改(update)、查(query)四个方法

    5.3 在查询者的逻辑方法里,得到内容解析者(ContentResolver),通过指定要查询的程序的主机名和地址,可以调用到内容提供者的增(insert)、
    删(delete)、改(update)、查(query)四个方法

    深入5.2,进行 扩展 :内容提供者通常出现在要 提供数据的应用内

    实现ContentProvider的(增删改查)四个方法;
    
    增: insert(Uri uri, ContentValues values)
        参数一:携带着解析者设置的主机名和地址  
        参数二:携带着解析者要插入的数据
    删: delete(Uri uri, String selection, String[] selectionArgs)
        参数一:携带着解析者设置的主机名和地址
        参数二:删除数据的约束条件
          参数三:删除数据的约束条件里,占位符(?)对应的数据
    改: update(Uri uri, ContentValues values, String selection,String[] selectionArgs)
         参数一:携带着解析者设置的主机名和地址
         参数二:携带着解析者要修改的数据 
         参数三:修改数据的约束条件  
         参数四:修改数据的约束条件里,占位符(?)对应的数据
    
    查:  query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
        参数一:携带着解析者设置的主机名和地址
        参数二:要查询的列名
        参数三:查询数据的约束条件
        参数四:查询数据的约束条件里,占位符(?)对应的数据
        参数五:排序
    

    深入5.3,进行 扩展 :内容解析者通常出现在要 查询其他程序 的应用里

    getContentResolver():得到内容解析者
    
    增:contentResolver.insert(uri, values);
    
        通过内容解析者操作内容提供者的insert方法
        参数一:内容提供者的主机地址
        参数二:要插入的数据
    
    删: contentResolver.delete(url, where, selectionArgs)
    
        通过内容解析者操作内容提供者的update方法
        参数一:内容提供者的主机地址
        参数二:删除数据的约束条件
        参数三:约束条件占位符(?)的匹配数据
    
    改: contentResolver.update(uri, values, where, selectionArgs)
    
        通过内容解析者操作内容提供者的update方法
        参数一:内容提供者的主机地址
        参数二:要修改的数据
        参数三:修改数据的约束条件
        参数四:约束条件占位符(?)的匹配数据
    
    查: contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
    
        通过内容解析者操作内容提供者的query方法
        参数一:内容提供者的主机地址
        参数二:要查询的列名
        参数三:查询的约束条件
        参数四:约束条件占位符(?)的匹配数据
        参数五:排序
    
  4. 示例代码:

建立内容提供者,供其他应用程序访问

一. 建立数据库

    public class MyHelper extends SQLiteOpenHelper {
        private static String NAME="provideCondent.db";
        private String create_user="create table user(_id integer primary key autoincrement ,name text ,age text);";
        private String create_people="create table people (_id integer primary key autoincrement ,pe_name text ,pe_age text);";

        public MyHelper(Context context) {
            super(context, NAME, null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(create_user);
            db.execSQL(create_people);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

        }

    }

二. 创建内容提供者,实现 增删改查 的方法

    public class MyContentProvider extends ContentProvider {
        private static final int USER=1;
        private static final int PEOPLE=2;
        private SQLiteDatabase database;
        private UriMatcher uriMatcher;
            @Override
            public boolean onCreate() {
                //创建数据库对象
                 MyHelper myHelper = new  MyHelper(getContext());
                 database = myHelper.getReadableDatabase();
                 // 获取匹配表格

                 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
                // uriMatcher.addURI(authority 主机名, path 表格, code 标示)
                 //匹配规则
                {
                     uriMatcher.addURI("com.example.android3_providecontent_demo2", "user", USER);
                     uriMatcher.addURI("com.example.android3_providecontent_demo2", "people", PEOPLE);

                 }
                return false;
            }

            @Override
            public Cursor query(Uri uri, String[] projection, String selection,
                    String[] selectionArgs, String sortOrder) {
                int match = uriMatcher.match(uri);
                Cursor cursor=null;
                switch (match) {
                case USER:
                    cursor = database.query("user", projection, selection, selectionArgs, null, null, null);
                    break;
                case PEOPLE:
                     cursor =database.query("people", projection, selection, selectionArgs, null, null, null);
                    break;

                default:
                    break;
                }

                return cursor;
            }

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

            @Override
            public Uri insert(Uri uri, ContentValues values) {
                int match = uriMatcher.match(uri);
                switch (match) {
                case USER:
                    database.insert("user", null, values);
                    break;
                case PEOPLE:
                    database.insert("people", null, values);
                    break;

                default:
                    break;
                }
                return uri;
            }

            @Override
            public int delete(Uri uri, String selection, String[] selectionArgs) {
                int match = uriMatcher.match(uri);
                switch (match) {
                case USER:
                    database.delete("user", selection, selectionArgs);
                    break;
                case PEOPLE:
                    database.delete("people", selection, selectionArgs);
                    break;

                default:
                    break;
                }
                return 0;
            }

            @Override
            public int update(Uri uri, ContentValues values, String selection,
                    String[] selectionArgs) {
                int match = uriMatcher.match(uri);
                switch (match) {
                case USER:
                    database.update("user", values, selection, selectionArgs);
                    break;
                case PEOPLE:
                    database.update("people", values, selection, selectionArgs);

                    break;

                default:
                    break;
                }
                return 0;
            }

    }

三. 活动中创建数据库
    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //创建数据库
             MyHelper myHelper = new  MyHelper(this);
             myHelper.getReadableDatabase();
        }

    }

建立其他应用程序,访问内容解析者,操作提供内容提供者程序的数据库

其他应用程序,访问其他程序数据库,并对其他应用程序数据库进行操作。
    public class MainActivity extends Activity {

        private ListView main_listView;
        private ArrayList<String> list;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            list = new ArrayList<String>();
            main_listView = (ListView) findViewById(R.id.main_listView);
        }

        public void insert(View v) {
            // 获取内容解析者
            ContentResolver resolver = getContentResolver();
            // 插入数据 com.example.android3_providecontent_demo2
            Uri uri = Uri
                    .parse("content://com.example.android3_providecontent_demo2/people");
            ContentValues values = new ContentValues();
            values.put("pe_name", "杨过");
            values.put("pe_age", "20");
            resolver.insert(uri, values);
        }

        public void query(View v){
            list.clear();
            //获取内容解析者
            ContentResolver resolver = getContentResolver();
            //查询数据
            Uri uri=Uri.parse("content://com.example.android3_providecontent_demo2/people");
            Cursor cursor = resolver.query(uri, new String[]{"_id","pe_name","pe_age"}, "pe_name=?", new String[]{"杨过"}, null);
            //遍历
            while(cursor.moveToNext()){
                String name=cursor.getString(cursor.getColumnIndex("pe_name"));
                String age=cursor.getString(cursor.getColumnIndex("pe_age"));
                String _id=cursor.getString(cursor.getColumnIndex("_id"));
                System.out.println(_id+"--"+name+"---"+age);
                list.add("id"+_id+"pe_name"+name+"pe_age"+age);
            }

            main_listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));

        }

        public void delete(View v) {
            // 获取内容解析者
            ContentResolver resolver = getContentResolver();
            // 获取URI
            Uri uri=  Uri.parse("content://com.example.android3_providecontent_demo2/user");

            resolver.delete(uri, "name=?", new String[] { "杨过" });
        }

        public void update(View v) {
            // 获取内容解析者
            ContentResolver resolver = getContentResolver();
            // 获取URI
            Uri uri=Uri.parse("content://com.example.android3_providecontent_demo2/user");
            ContentValues values = new ContentValues();
            values.put("name", "杨过");
            values.put("age", "200");
            resolver.update(uri, values, "name=?", new String[] { "杨过" });
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值