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 ...
随机推荐
- Sql server decimal 和 numeric
带固定精度和小数位数的数值数据类型. decimal[ (p[ , s] )] 和 numeric[ (p[ , s] )] 固定精度和小数位数.使用最大精度时,有效值从 - 10^38 +1 到 1 ...
- Show username instead of "System Account" in SharePoint 2010
Problems: When I load my local SharePoint site, the account always show as "System Account" ...
- gdb 调试c/c++的一些小技巧
ptype obj/class/struct 查看obj/class/struct的成员,但是会把基类指针指向的派生类识别为基类 set print object on 这个选项可以看到派生对象的 ...
- USACO4.13Fence Loops(无向图最小环)
最近脑子有点乱 老是不想清楚就啪啪的敲 敲完之后一看 咦..样例都过不去 仔细一想 这样不对啊 刚开始就写了一SPFA 最后发现边跟点的关系没处理好 删了..写dfs..还是没转化好 开始搜解题方法 ...
- C#中的深拷贝与浅拷贝
1.基本的概念: 首先我们应该了解一下什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy). a.浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍 ...
- Mysql规范和使用注意点(转)
命名规范: 1表名,字段名,索引名称使用小写字母,数字采用下划线进行分割 2.表名采用模块名3个缩小字符 '前缀'之后顺序为表明 3.表名,字段名不超过32个字符 4.存储尸体数据的表,名称使用名词, ...
- cannot find the word template:WordToRqm.dot的解决方法
powerdesigner安装后: C:"Program Files"Sybase"PowerDesigner 12"Add-ins"Microsof ...
- 教你如何通过ICCID找回丢失的的iPhone
22日晚买了FACETIME,在某宝上买的.价格不贵,可以查到偷手机的人注册FT的号码,还可以查询手机被刷机和被维修的日期(这个很关键) 27日手机被刷机,遂买了某宝查询ICCID的服务,找到一串IC ...
- [liu yanling]软件测试分为哪几个计划过程阶段
a) 计划阶段:编写测试计划,搭建测试环境,准备测试数据b) 设计阶段:编写测试用例(需求分析和测试用例文档)c) 执行阶段:执行测试用例,生成缺陷d) 报告阶段:测试报告,改进意见
- [codevs]失恋28天题目系列
失恋28天-追女孩篇 题目描述 Description 呵呵,相信大家失恋33天都看过吧,里面的主人公黄小仙和王小贱都有印象吧!这回我要给大家讲的是我 们班同学的失恋经历,呵呵他总共失恋了28天.但是 ...