前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android100 自定义内容提供者

android100 自定义内容提供者

作者头像
全栈程序员站长
发布2022-09-07 11:26:31
3170
发布2022-09-07 11:26:31
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
复制
#ContentProvider,就是来操作数据的,增删改查, * 四大组件之一
* 应用的数据库是不允许其他应用访问的
* 内容提供者的作用就是让别的应用访问到你的数据库 * 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用
*短信联系人都是在数据库里面。mmssms是短信数据库,
*短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者。拿到对应数据库的内容提供者就能够访问对应的数据库数据。

###短信数据库
* sms表
    * body:短信内容
    * date:短信时间
    * address:对方号码
    * type:发送还是接收

###联系人数据库
* raw_contacts表
    * contact_id:联系人id
* data表:存放联系人的详细的信息,每行数据是单独的一条联系人信息
    * data1:联系人的具体的信息
    * raw_contact_id:该行信息属于哪个联系人
    * mimetype_id:该行信息属于什么类型
* mimetypes表:mimetype_id对应的类型的字符串


###UriMatcher
* 用于判断一条uri跟指定的多条uri中的哪条匹配
* 添加匹配规则

        //指定多条uri
        um.addURI("com.itheima.person", "person", PERSON_CODE);
        um.addURI("com.itheima.person", "company", COMPANY_CODE);
        //#号可以代表任意数字
        um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
* 通过Uri匹配器可以实现操作不同的表

        @Override
        public Uri insert(Uri uri, ContentValues values) {
            if(um.match(uri) == PERSON_CODE){
                db.insert("person", null, values);
            }
            else if(um.match(uri) == COMPANY_CODE){
                db.insert("company", null, values);
            }
            else{
                throw new IllegalArgumentException();
            }
            return uri;
        }
* 如果路径中带有数字,把数字提取出来的api

        int id = (int) ContentUris.parseId(uri);
代码语言:javascript
复制
01项目的MyOpenHelper:

package com.itheima.customcontentprovider;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {
        super(context, "people.db", null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table person(_id integer primary key autoincrement, name char(10), money integer(20))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("create table teacher(_id integer primary key autoincrement, name char(10))");
    }
}
代码语言:javascript
复制
01项目Test.java

package com.itheima.customcontentprovider;

import android.test.AndroidTestCase;

public class Test extends AndroidTestCase {

    public void test(){
        MyOpenHelper oh = new MyOpenHelper(getContext());//getContext()是获取虚礼上下文
        oh.getWritableDatabase();
    }
}
代码语言:javascript
复制
02项目的MainActivity.java

package com.itheima.visitprovider;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void insert(View v){
        //通过内容提供者把数据插入people数据库
        //拿到contentResolver来访问内容提供者
        ContentResolver cr = getContentResolver();
        ContentValues values = new ContentValues();
        values.put("name", "赵帅哥");
//        values.put("money", "13000");
        //url:内容提供者的主机名地址
        //values:要插入的数据
        cr.insert(Uri.parse("content://com.itheima.people/teacher"), values);//com.itheima.people是01项目的内容提供者的地址,teacher表示插入teacher表
        
    }
    
    public void delete(View v){
        ContentResolver cr = getContentResolver();
        int i = cr.delete(Uri.parse("content://com.itheima.people"), "name = ?", new String[]{"小志"});
        System.out.println(i);
    }
    public void update(View v){
        ContentResolver cr = getContentResolver();
        ContentValues values = new ContentValues();
        values.put("name", "sb志");
        int i = cr.update(Uri.parse("content://com.itheima.people"), values, "name = ?", new String[]{"大志"});
        System.out.println(i);
    }
    
    public void select(View v){
        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(Uri.parse("content://com.itheima.people/person/4"), null, null, null, null);//person表示是person表,4是用来作id的,
        while(cursor.moveToNext()){
            String name = cursor.getString(1);
            String money = cursor.getString(2);
            System.out.println(name + ";" + money);
        }
    }
    
}
代码语言:javascript
复制
01项目PersonProvider.java

package com.itheima.customcontentprovider.provider;

import com.itheima.customcontentprovider.MyOpenHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonProvider extends ContentProvider {

    private MyOpenHelper oh;
    SQLiteDatabase db;

    //创建uri匹配器对象
    static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
    //检测其他用户传入的uri与匹配器定义好的uri中,哪条匹配
    static {
        um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/person
        um.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacher
        um.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4,#表示任何数字,*表示任何文本,
    }
    
    //内容提供者创建时调用
    @Override
    public boolean onCreate() {
        oh = new MyOpenHelper(getContext());
        db = oh.getWritableDatabase();
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        Cursor cursor = null;
        if(um.match(uri) == 1){
            cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);
        }
        else if(um.match(uri) == 2){
            cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
        }
        else if(um.match(uri) == 3){
            //把uri末尾携带的数字取出来
            long id = ContentUris.parseId(uri);
            cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);
        }
        else{
            throw new IllegalArgumentException("uri又有问题哟亲么么哒");
        }
        return cursor;
    }

    @Override
    public String getType(Uri uri) {
        if(um.match(uri) == 1){
            return "vnd.android.cursor.dir/person";//表示请求的是person的多条数据
        }
        else if(um.match(uri) == 3){
            return "vnd.android.cursor.item/person";//表示请求的是person的单条数据
        }
        return null;
    }

    //此方法供其他应用调用,用于往people数据库里插数据
    //values:由其他应用传入,用于封装要插入的数据
    //uri:内容提供者的主机名,也就是地址
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //使用uri匹配器匹配传入的uri
        if(um.match(uri) == 1){
            db.insert("person", null, values);
            
            //发送数据改变的通知
            //uri:通知发送到哪一个uri上,所有注册在这个uri上的内容观察者都可以收到这个通知
            getContext().getContentResolver().notifyChange(uri, null);
        }
        else if(um.match(uri) == 2){
            db.insert("teacher", null, values);
            
            getContext().getContentResolver().notifyChange(uri, null);
        }
        else{
            throw new IllegalArgumentException("uri有问题哟亲么么哒");
        }
        return uri;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int i = db.delete("person", selection, selectionArgs);
        return i;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        int i = db.update("person", values, selection, selectionArgs);
        return i;
    }

}
/*
 清单文件:
<provider android:name="com.itheima.customcontentprovider.provider.PersonProvider"
android:authorities="com.itheima.people"
android:exported="true">
</provider>        
authorities="com.itheima.people"是一个地址,是内容提供者的地址,通过这个地址就可以访问到这个内容提供者


<instrumentation android:name="android.test.InstrumentationTestRunner"
    android:targetPackage="com.itheima.customcontentprovider">
</instrumentation>
*/

02项目就访问到了01项目的数据库。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154726.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档