0

0

Android中自定义ContentProvider实例

高洛峰

高洛峰

发布时间:2017-02-07 15:51:50

|

1245人浏览过

|

来源于php中文网

原创

//以下为testbaidu 
mainactivity如下: 

package cn.testbaidu; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.ContentValues; 
import android.database.Cursor; 
/** 
* Demo描述: 
* 应用A(TestBaidu)调用另外一个应用(TestContentProvider) 
* 中的自定义ContentProvider,即: 
* 1 自定义ContentProvider的使用 
* 2 其它应用调用该ContentProvider 
* 
* 测试方法: 
* 1 依次测试ContentProvider的增查删改(注意该顺序) 
* 2 其它应用查询该ContentProvider的数据 
* 
*/ 
public class MainActivity extends Activity { 
private Button mAddButton; 
private Button mDeleteButton; 
private Button mUpdateButton; 
private Button mQueryButton; 
private Button mTypeButton; 
private ContentResolver mContentResolver; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
init(); 
} 
private void init() { 
mContentResolver=this.getContentResolver(); 

mAddButton=(Button) findViewById(R.id.addButton); 
mAddButton.setOnClickListener(new ClickListenerImpl()); 

mDeleteButton=(Button) findViewById(R.id.deleteButton); 
mDeleteButton.setOnClickListener(new ClickListenerImpl()); 

mUpdateButton=(Button) findViewById(R.id.updateButton); 
mUpdateButton.setOnClickListener(new ClickListenerImpl()); 

mQueryButton=(Button) findViewById(R.id.queryButton); 
mQueryButton.setOnClickListener(new ClickListenerImpl()); 

mTypeButton=(Button) findViewById(R.id.typeButton); 
mTypeButton.setOnClickListener(new ClickListenerImpl()); 

} 
private class ClickListenerImpl implements OnClickListener{ 
@Override 
public void onClick(View v) { 
switch (v.getId()) { 
case R.id.addButton: 
Person person=null; 
for (int i = 0; i < 5; i++) { 
person=new Person("xiaoming"+i, "9527"+i,(8888+i)); 
testInsert(person); 
} 
break; 
case R.id.deleteButton: 
testDelete(1); 
break; 
case R.id.updateButton: 
testUpdate(3); 
break; 
case R.id.queryButton: 
//查询表 
//queryFromContentProvider(-1); 

//查询personid=2的数据 
testQuery(2); 
break; 
case R.id.typeButton: 
testType(); 
break; 
default: 
break; 
} 

} 

} 
private void testInsert(Person person) { 
ContentValues contentValues=new ContentValues(); 
contentValues.put("name", person.getName()); 
contentValues.put("phone", person.getPhone()); 
contentValues.put("salary",person.getSalary()); 
Uri insertUri=Uri.parse("content://cn.bs.testcontentprovider/person"); 
Uri returnUri=mContentResolver.insert(insertUri, contentValues); 
System.out.println("新增数据:returnUri="+returnUri); 
} 

private void testDelete(int index){ 
Uri uri=Uri.parse("content://cn.bs.testcontentprovider/person/"+String.valueOf(index)); 
mContentResolver.delete(uri, null, null); 
} 

private void testUpdate(int index){ 
Uri uri=Uri.parse("content://cn.bs.testcontentprovider/person/"+String.valueOf(index)); 
ContentValues values=new ContentValues(); 
values.put("name", "hanmeimei"); 
values.put("phone", "1234"); 
values.put("salary", 333); 
mContentResolver.update(uri, values, null, null); 
} 
private void testQuery(int index) { 
Uri uri=null; 
if (index<=0) { 
//查询表 
uri=Uri.parse("content://cn.bs.testcontentprovider/person"); 
} else { 
//按照id查询某条数据 
uri=Uri.parse("content://cn.bs.testcontentprovider/person/"+String.valueOf(index)); 
} 

//对应上面的:查询表 
//Cursor cursor= mContentResolver.query(uri, null, null, null, null); 

//对应上面的:查询personid=2的数据 
//注意:因为name是varchar字段的,所以应该写作"name='xiaoming1'" 
// 若写成"name=xiaoming1"查询时会报错 
Cursor cursor= mContentResolver.query(uri, null, "name='xiaoming1'", null, null); 

while(cursor.moveToNext()){ 
int personid=cursor.getInt(cursor.getColumnIndex("personid")); 
String name=cursor.getString(cursor.getColumnIndex("name")); 
String phone=cursor.getString(cursor.getColumnIndex("phone")); 
int salary=cursor.getInt(cursor.getColumnIndex("salary")); 
System.out.println("查询得到:personid=" + personid+",name="+name+",phone="+phone+",salary="+salary); 
} 
cursor.close(); 
} 

private void testType(){ 
Uri dirUri=Uri.parse("content://cn.bs.testcontentprovider/person"); 
String dirType=mContentResolver.getType(dirUri); 
System.out.println("dirType:"+dirType); 

Uri itemUri=Uri.parse("content://cn.bs.testcontentprovider/person/3"); 
String itemType=mContentResolver.getType(itemUri); 
System.out.println("itemType:"+itemType); 
} 
}

Person如下: 

package cn.testbaidu; 
public class Person { 
private Integer id; 
private String name; 
private String phone; 
private Integer salary; 
public Person(String name, String phone,Integer salary) { 
this.name = name; 
this.phone = phone; 
this.salary=salary; 
} 
public Person(Integer id, String name, String phone,Integer salary) { 
this.id = id; 
this.name = name; 
this.phone = phone; 
this.salary=salary; 
} 
public Integer getId() { 
return id; 
} 
public void setId(Integer id) { 
this.id = id; 
} 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public String getPhone() { 
return phone; 
} 
public void setPhone(String phone) { 
this.phone = phone; 
} 
public Integer getSalary() { 
return salary; 
} 
public void setSalary(Integer salary) { 
this.salary = salary; 
} 
@Override 
public String toString() { 
return "Person [id=" + id + ", name=" + name + ", phone=" + phone+ ", salary=" + salary + "]"; 
} 



}

main.xml如下: 

 

//以下为TestContentProvider 
MainActivity如下: 

package cn.testcontentprovider; 
import android.app.Activity; 
import android.os.Bundle; 
public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
} 
}

ContentProviderTest如下: 

自定义mp3音频文件播放实例
自定义mp3音频文件播放实例

jQuery网页悬浮的音频播放器点击按钮显示或隐藏,支持自定义mp3暂停播放效果。

下载
package cn.testcontentprovider; 
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; 
/** 
* 注意事项: 
* 在AndroidManifest.xml中注册ContentProvider时的属性 
* android:exported="true"表示允许其他应用访问. 
* 这样TestBaidu这个应用才可以访问该处的ContentProvider 
*/ 
public class ContentProviderTest extends ContentProvider { 
private DBOpenHelper dbOpenHelper; 
private UriMatcher URI_MATCHER; 
private static final int PERSONS = 0; 
private static final int PERSON = 1; 

@Override 
public boolean onCreate() { 
initUriMatcher(); 
dbOpenHelper=new DBOpenHelper(getContext()); 
return true; 
} 
//初始化UriMatcher 
private void initUriMatcher(){ 
URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); 
//表示返回所有的person,其中PERSONS为该特定Uri的标识码 
URI_MATCHER.addURI("cn.bs.testcontentprovider","person", PERSONS); 
//表示返回某一个person,其中PERSON为该特定Uri的标识码 
URI_MATCHER.addURI("cn.bs.testcontentprovider","person/#", PERSON); 
} 
/** 
* 插入操作: 
* 插入操作只有一种可能:向一张表中插入 
* 返回结果为新增记录对应的Uri 
* 方法db.insert()返回结果为新增记录对应的主键值 
*/ 
@Override 
public Uri insert(Uri uri, ContentValues values) { 
SQLiteDatabase db=dbOpenHelper.getWritableDatabase(); 
switch (URI_MATCHER.match(uri)) { 
case PERSONS: 
long rowid=db.insert("person", "name,phone,salary", values); 
return ContentUris.withAppendedId(uri, rowid); 
default: 
throw new IllegalArgumentException("unknown uri"+uri.toString()); 
} 
} 

/** 
* 更新操作: 
* 更新操作有两种可能:更新一张表或者更新某条数据 
* 在更新某条数据时原理类似于查询某条数据,见下. 
*/ 
@Override 
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
SQLiteDatabase db=dbOpenHelper.getWritableDatabase(); 
int updataNum=0; 
switch (URI_MATCHER.match(uri)) { 
//更新表 
case PERSONS: 
updataNum=db.update("person", values, selection, selectionArgs); 
break; 
//按照id更新某条数据 
case PERSON: 
long id=ContentUris.parseId(uri); 
String where="personid="+id; 
if(selection!=null&&!"".equals(selection.trim())){ 
where=selection+" and "+where; 
} 
updataNum=db.update("person", values, where, selectionArgs); 
break; 
default: 
throw new IllegalArgumentException("unknown uri"+uri.toString()); 
} 
return updataNum; 
} 

/** 
* 删除操作: 
* 删除操作有两种可能:删除一张表或者删除某条数据 
* 在删除某条数据时原理类似于查询某条数据,见下. 
*/ 
@Override 
public int delete(Uri uri, String selection, String[] selectionArgs) { 
SQLiteDatabase db=dbOpenHelper.getWritableDatabase(); 
int deletedNum=0; 
switch (URI_MATCHER.match(uri)) { 
//删除表 
case PERSONS: 
deletedNum=db.delete("person", selection, selectionArgs); 
break; 
//按照id删除某条数据 
case PERSON: 
long id=ContentUris.parseId(uri); 
String where="personid="+id; 
if(selection!=null&&!"".equals(selection.trim())){ 
where=selection+" and "+where; 
} 
deletedNum=db.delete("person", where, selectionArgs); 
break; 
default: 
throw new IllegalArgumentException("unknown uri"+uri.toString()); 
} 
return deletedNum; 
} 
/** 
* 查询操作: 
* 查询操作有两种可能:查询一张表或者查询某条数据 
* 注意事项: 
* 在查询某条数据时要注意--因为此处是按照personid来查询 
* 某条数据,但是同时可能还有其他限制.例如: 
* 要求personid为2且name为xiaoming1 
* 所以在查询时分为两步: 
* 第一步: 
* 解析出personid放入where查询条件 
* 第二部: 
* 判断是否有其他限制(如name),若有则将其 
* 组拼到where查询条件. 
* 详细代码见下. 
*/ 
@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
SQLiteDatabase db=dbOpenHelper.getWritableDatabase(); 
Cursor cursor; 
switch (URI_MATCHER.match(uri)) { 
//查询表 
case PERSONS: 
cursor=db.query("person", projection, selection, selectionArgs, null, null, sortOrder); 
break; 
//按照id查询某条数据 
case PERSON: 
//第一步: 
long id=ContentUris.parseId(uri); 
String where="personid="+id; 
//第二步: 
if(selection!=null&&!"".equals(selection.trim())){ 
where=selection+" and "+where; 
} 
cursor=db.query("person", projection, where, selectionArgs, null, null, sortOrder); 
break; 
default: 
throw new IllegalArgumentException("unknown uri"+uri.toString()); 
} 
return cursor; 
} 

/** 
* 返回当前Uri所代表的数据的MIME类型. 
* 如果该Uri对应的数据可能包含多条记录,那么返回 
* 字符串应该以"vnd.android.cursor.dir/"开头 
* 如果该Uri对应的数据只包含一条记录,那么返回 
* 字符串应该以"vnd.android.cursor.item/"开头 
*/ 
@Override 
public String getType(Uri uri) { 
switch (URI_MATCHER.match(uri)) { 
case PERSONS: 
return "vnd.android.cursor.dir/persons"; 
case PERSON: 
return "vnd.android.cursor.item/person"; 
default: 
throw new IllegalArgumentException("unknown uri"+uri.toString()); 
} 
} 
}

DBOpenHelper如下: 

package cn.testcontentprovider; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
public class DBOpenHelper extends SQLiteOpenHelper { 
public DBOpenHelper(Context context) { 
super(context, "contentprovidertest.db", null, 1); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
db.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone varchar(12),salary Integer(12))"); 
} 
//当数据库版本号发生变化时调用该方法 
@Override 
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
//db.execSQL("ALTER TABLE person ADD phone varchar(12) NULL"); 
//db.execSQL("ALTER TABLE person ADD salary Integer NULL"); 
} 
}

AndroidManifest.xml如下: 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

更多Android中自定义ContentProvider实例相关文章请关注PHP中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

56

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

157

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

37

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

4

2026.02.11

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

5

2026.02.11

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

156

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

84

2026.02.10

谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程
谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程

本专题汇总了谷歌邮箱网页版的最新登录入口和注册方法,详细提供官方账号快速访问方式、网页版操作教程及安全登录技巧,帮助用户轻松管理Gmail邮箱账户,实现高效、安全的邮箱使用体验。

73

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 16.7万人学习

Java 教程
Java 教程

共578课时 | 63.5万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号