android100 自定义内容提供者

简介:
 
 

#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项目的数据库。




本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4970145.html,如需转载请自行联系原作者


相关文章
|
19天前
|
Java API 调度
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
41 0
|
19天前
|
存储 Java Linux
Android Mstar增加IR 自定义遥控头码完整调试过程
Android Mstar增加IR 自定义遥控头码完整调试过程
27 1
|
1月前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
1月前
|
前端开发 Android开发 开发者
深入探究Android中的自定义View组件开发
【4月更文挑战第3天】 在现代Android应用程序的开发过程中,创建具有独特功能和高度定制化的用户界面是一个常见需求。为此,理解并掌握自定义View组件的开发成为了开发者必备的技能之一。本文将深入探讨如何在Android中创建自定义View,从基础的绘制原理到事件处理机制,再到性能优化技巧,旨在为读者提供一个全面的技术视角,并通过实例代码演示如何实现一个功能丰富、响应迅速的自定义View组件。
|
1月前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
58 1
|
5月前
|
XML Android开发 数据安全/隐私保护
Android 自定义开源库 EasyView
Android 自定义开源库 EasyView
|
2天前
|
XML Android开发 数据格式
Android下自定义Button样式
Android下自定义Button样式
10 3
|
2天前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
|
2天前
|
搜索推荐 Android开发
自定义Android标题栏TitleBar布局
自定义Android标题栏TitleBar布局
|
19天前
|
Android开发 芯片
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
26 3