android100 自定义内容提供者

android100 自定义内容提供者#ContentProvider,就是来操作数据的,增删改查,*四大组件之一*应用的数据库是不允许其他应用访问的*内容提供者的作用就是让别的应用访问到你的数据库*内容提供者的作用:把私有数据暴

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

#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);
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))"); } }
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(); } }
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); } } }
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.net/154726.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Windows11来了】立刻安装Windows11预览版抢先体验(虚拟机 | 含详细安装步骤)

    【Windows11来了】立刻安装Windows11预览版抢先体验(虚拟机 | 含详细安装步骤)本文介绍了使用虚拟机安装Windows11预览版操作系统的过程,并体验了一下新系统

    2022年7月16日
    17
  • cBridge 2.0 测试网上线!

    cBridge 2.0 测试网上线!我们在上个月末发布了cBridge2.0计划,现在我们很高兴地向大家宣布,cBridge2.0测试网正式启动!cBridge2.0建立的目的是为用户提供更简单的操作体验,它具有高度可扩展和足够深度的多链流动性管理系统,每日为用户提供数十亿美元的跨链转账流动性。用户和流动性提供者(LPs)可以通过test-cbridge-v2.celer.network访问cBridge2.0测试网,熟悉更简单的跨链转账流程,全新的流动性管理和流动性挖矿功能。随着测试网上线,我们同时推出了一…

    2022年6月4日
    41
  • Flask表单提交的方法[通俗易懂]

    Flask表单提交的方法[通俗易懂]这里介绍一下Flask表单提交相关的方法,还是以代码实例为主。首先,Flask模板中表单提交代码与我们一般写的H5表单无异,当然,Flask也提供了表单类,Flask-WTF扩展。这里只介绍常规的表单提交方法。首先是模板类:&lt;!DOCTYPEhtml&gt;&lt;htmllang="en"&gt;&lt;head&gt;&lt;metacharset="UTF-8"&g…

    2022年9月16日
    3
  • 4K型护套连接器_电缆网套怎么使用方法

    4K型护套连接器_电缆网套怎么使用方法LCYVB-4型钢丝编织橡胶护套连接器4C型护套连接器4K型护套连接器 范围 本标准规定了LCYVB-4型钢丝编织橡胶护套连接器(简称连接器)的产品分类、基本参数、技术要求与试验方法、检验规则、标志、包装、运输和贮存。本标准适用于LCYVB-4型钢丝编织橡胶护套连接器系列产品。 规范性引用文件 下列件中的条款通过本标准的引用而成为本标准的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本标准,然而,鼓励根据本标准达成…..

    2022年10月2日
    2
  • [转载]interp1「建议收藏」

    [转载]interp1「建议收藏」MATLAB中的插值函数为interp1,其调用格式为:yi=interp1(x,y,xi,’method’)其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,’method’表示采用的插值方法,MATLAB提供的插值方法有几种:’method’是最邻近插值,’linear’线性插值;’spline’三次样条插值;’cub…

    2022年5月25日
    44
  • RowBounds分页_bootstrap 分页

    RowBounds分页_bootstrap 分页只要给接口增加一个RowBounds传输就可以了。//下面测试MyBatis自带的分页类RowBounds功能publicList&lt;Role&gt;findByRowBounds(@Param("roleName")Stringrolename,@Param("note")Stringnote,RowBoundsrowBounds);而映射文件不需要任何…

    2022年9月22日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号