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项目的数据库。
android100 自定义内容提供者的更多相关文章
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- Android应用开发基础之九:内容提供者(ContentProvider)
内容提供者 应用的数据库是不允许其他应用访问的 内容提供者的作用:就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代 ...
- android 学习随笔二十一(内容提供者 )
一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查 ...
- 内容提供者(Content Provider)——跨程序共享数据
内容提供者 Content Provider 应用的数据库是不允许其他应用访问的 内容提供者的作用就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方 ...
- 【Android】安卓四大组件之内容提供者
[Android]安卓四大组件之内容提供者 1.关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分 ...
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- Android 内容提供者简介
在Android应用中,我们可以使用显式意图(Explicit Intent)来直接访问其他应用的Activity,但是这仅限于Activity的范畴:如果需要使用其他应用的数据,还需要用到另外一种组 ...
- Android组件系列----ContentProvider内容提供者
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- contentProvider内容提供者
contentProvider内容提供者 15. 四 / android基础 / 没有评论 步骤 权限在application中注册 Source code <provider an ...
随机推荐
- VirtualBox虚拟vdi磁盘扩容
http://blog.chinaunix.net/uid-25627207-id-3342576.html
- is present but cannot be translated into a null value due to being declared as a primitive type
解决办法:把基本类型改为对象,譬如此处将pageId的类型由int 改为Integer 2016-10-19 19:36:11.275 DEBUG [http-nio-9999-exec-2][org ...
- ServletInvocableHandlerMethod:167 - Error resolving argument
at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(R ...
- C#中的@符号
C# 中的 @ 符号 C# 中的 @ 符号其实有很多的用法,我们来看看 @ 有什么神奇之处. 1. 限定字符串 用 @ 符号加在字符串前面表示其中的转义字符 “ 不 ” 被处理. 如果我们写一个文 ...
- Linux Kernel 本地内存损坏漏洞
漏洞名称: Linux Kernel 本地内存损坏漏洞 CNNVD编号: CNNVD-201310-663 发布时间: 2013-11-05 更新时间: 2013-11-05 危害等级: 漏洞类 ...
- asp.net mvc ChildActionOnly 和ActionName的用法
ChildActionOnly的目的主要就是让这个Action不通过直接在地址栏输入地址来访问,而是需要通过RenderAction来调用它. <a href="javascript: ...
- 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密
关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...
- 深入理解OAuth2.0
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
- LightOJ 1138 Trailing Zeroes (III) 打表
就是统计5,然后当时因为发现最多有8000w个5的倍数,然后8000w/100,是80w,打表,二分找 然后我看网上的都是直接二分找,真是厉害 #include <cstdio> #inc ...
- POJ 2502 Subway dij
这个题的输入输出注意一下就好 #include<cstdio> #include<cstring> #include<queue> #include<cstd ...