Android共享数据ContentProvider的使用
本文来自:http://yaku2688.iteye.com/blog/1185364
ContentProvider数据共享
1.首先在AndroidManifest.xml文件中添加对外暴露的数据共享接口Content
- <provider android:name=".UserProvider" android:authorities="com.yaku.ContentProvider.userprovider"/>
ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,authorities 就是他的域名
2.Url解析
content://com.yaku.ContentProvider.userprovider/user/2
【content://】 Android定义的内容提供都的Schema
【com.yaku.ContentProvider.userprovider】 主机名或者authorities
【user】 路径
【2】 ID
示例代码:
数据结构User.java:
- package com.yaku.pojo;
- public class User {
- private int id;
- private String name;
- private int age;
- public User(int id, String name, int age) {
- super();
- this.id = id;
- this.name = name;
- this.age = age;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "User [age=" + age + ", id=" + id + ", name=" + name + "]";
- }
- }
数据库操作DBOpenHelper.java:
- package com.yaku.db;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- public class DBOpenHelper extends SQLiteOpenHelper {
- private static final String DBNAME = "yaku.db"; //数据库名称
- private static final int DBVER = 1;//数据库版本
- public DBOpenHelper(Context context) {
- super(context, DBNAME, null, DBVER);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)";
- db.execSQL(sql);//执行有更改的sql语句
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
- db.execSQL("DROP TABLE IF EXISTS user");
- onCreate(db);
- }
- }
对外共享处理类ContentProviderUser.java:
- package com.yaku.ContentProvider;
- import com.yaku.db.DBOpenHelper;
- 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 ContentProviderUser extends ContentProvider {
- private DBOpenHelper dbOpenHelper;
- //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
- private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
- private static final int USERS = 1;
- private static final int USER = 2;
- static{
- //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1
- MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS);
- //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2
- MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- int count = 0;
- switch (MATCHER.match(uri)) {
- case USERS:
- count = db.delete("user", selection, selectionArgs);
- return count;
- case USER:
- //ContentUris类用于获取Uri路径后面的ID部分
- long id = ContentUris.parseId(uri);
- String where = "userid = "+ id;
- if(selection!=null && !"".equals(selection)){
- where = selection + " and " + where;
- }
- count = db.delete("user", where, selectionArgs);
- return count;
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- /**
- * 该方法用于返回当前Url所代表数据的MIME类型。
- * 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
- * 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
- */
- @Override
- public String getType(Uri uri) {
- switch (MATCHER.match(uri)) {
- case USERS:
- return "vnd.android.cursor.dir/user";
- case USER:
- return "vnd.android.cursor.item/user";
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (MATCHER.match(uri)) {
- case USERS:
- long rowid = db.insert("user", "name", values);
- Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri
- this.getContext().getContentResolver().notifyChange(uri, null);
- return insertUri;
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- @Override
- public boolean onCreate() {
- this.dbOpenHelper = new DBOpenHelper(this.getContext());
- return false;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
- switch (MATCHER.match(uri)) {
- case USERS:
- return db.query("user", projection, selection, selectionArgs, null, null, sortOrder);
- case USER:
- long id = ContentUris.parseId(uri);
- String where = "userid = "+ id;
- if(selection!=null && !"".equals(selection)){
- where = selection + " and " + where;
- }
- return db.query("user", projection, where, selectionArgs, null, null, sortOrder);
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- int count = 0;
- switch (MATCHER.match(uri)) {
- case USERS:
- count = db.update("person", values, selection, selectionArgs);
- return count;
- case USER:
- long id = ContentUris.parseId(uri);
- String where = "userid = "+ id;
- if(selection!=null && !"".equals(selection)){
- where = selection + " and " + where;
- }
- count = db.update("user", values, where, selectionArgs);
- return count;
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- }
单元测试类(在另一个应用中):
- package com.yaku.ContentProvider;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.test.AndroidTestCase;
- import android.util.Log;
- /**
- * 对ContentProvider工程中的ContentProviderActivity进行单元测试
- */
- public class ContentProviderActivityTest extends AndroidTestCase {
- private static final String TAG = "ContentProvider";
- //往内容提供者添加数据
- public void testInsert() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- ContentValues values = new ContentValues();
- values.put("name", "道长");
- values.put("age", 86);
- Uri uri = contentResolver.insert(insertUri, values);
- Log.i(TAG, uri.toString());
- }
- //更新内容提供者中的数据
- public void testUpdate() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
- ContentValues values = new ContentValues();
- values.put("name", "青眉道长");
- contentResolver.update(updateUri, values, null, null);
- }
- //从内容提供者中删除数据
- public void testDelete() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
- contentResolver.delete(deleteUri, null, null);
- }
- //获取内容提供者中的数据
- public void testFind() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
- while(cursor.moveToNext()){
- int id = cursor.getInt(cursor.getColumnIndex("userid"));
- String name = cursor.getString(cursor.getColumnIndex("name"));
- int age = cursor.getInt(cursor.getColumnIndex("age"));
- Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
- }
- }
- }
监听数据的变化:
- <span style="font-size: medium;">package com.yaku.ContentProvider;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.test.AndroidTestCase;
- import android.util.Log;
- /**
- * 监听数据变化
- */
- public class OtherContentProviderTest extends AndroidTestCase {
- private static final String TAG = "OtherContentProvider";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- ContentResolver contentResolver = this.getContentResolver();
- //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
- contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler()));
- }
- private final class PersonObserver extends ContentObserver{
- public PersonObserver(Handler handler) {
- super(handler);
- }
- @Override
- public void onChange(boolean selfChange) {
- ContentResolver contentResolver = getContentResolver();
- Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
- while(cursor.moveToNext()){
- int id = cursor.getInt(cursor.getColumnIndex("userid"));
- String name = cursor.getString(cursor.getColumnIndex("name"));
- int age = cursor.getInt(cursor.getColumnIndex("age"));
- Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
- }
- }
- }
- }
- </span>
Android共享数据ContentProvider的使用相关推荐
- [转]Android共享数据ContentProvider的使用
本文转自:http://yaku2688.iteye.com/blog/1185364 ContentProvider数据共享 1.首先在AndroidManifest.xml文件中添加对外暴露的数据 ...
- android 共享数据,android进程间共享简单数据
我们知道,在android中,保存简单的数据最方便的就是使用SharedPreferences,然而,SharedPreferences虽然说也可以设置成进程间共享数据,但是并不可靠(更致命的是,不同 ...
- provider android简书,Android 使用ContentProvider在应用间共享数据
Android 使用ContentProvider在应用间共享数据 题图 www.gratisography.com 在开发的过程中,有时会有需求要实现应用程序之间实现数据共享,在Android系统中 ...
- Android学习笔记---20_采用ContentProvider对外共享数据, UriMatcher类使用介绍 ,ContentUris类使用介绍,使用ContentResolver操作Conte
20_采用ContentProvider对外共享数据 ------------------------------------------ 1.比如通讯录,就是通过ContentProvider,实现 ...
- android 应用间共享数据,调用其他app数据资源
在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见:而我们可以使他们对其他的应用程序可见,可以通过Sha ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)
在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过Content Provider组件来实现.那么,Content Provide ...
- Android移动应用基础教程【使用内容提供者共享数据】
本章目录 一.内容提供者概述 二.创建内容提供者 三.访问其他应用程序 1.查询其他程序的数据 2 .查询系统短信 四.内容观察者 1.什么是内容观察者 2.监测数据变化 五.本章小结 一.内容提供者 ...
- 使用 ContentProvider 共享数据 访问与添加通讯录
1. 统一的数据访问方式 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据. 文件的操作模式中,通过指定文件的操作模式为Context.M ...
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...
最新文章
- 话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
- python【蓝桥杯vip练习题库】BASIC-28Huffuman树(贪心 Huffuman)
- Java字符串的十大问题
- python读取excel写入mysql pandas_python pandas 读取文件 写入文件excel
- java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
- 文字层一点就变红_学习观察神经网络:可视化整个模型训练中卷积层的激活
- python实现随机抽取答题_如何在python中实现随机选择
- html盒子模型子元素怎么水平占满父元素_立下flag)每日10道前端面试题18 关于【盒模型】十问...
- MySql Workbench表PK UN UQ B等字符的含义
- 排名算法(一)--PageRank
- 苹果Mac 桌面下方Dock 的App icon名称出现乱码怎么办?一个简单指令帮你解决
- AS技巧合集「常用技巧篇」
- 这些练习并没有多少用,但舍不得就扔了,作个记录吧。
- Linux网络嗅探工具,微软“雪藏”的七个Windows 10强力工具
- 未来杯总结1--cuda8.0+cuDnnv6+anavonda+tensorflow-gpu+keras+ubuntu16.04
- docker---dockerfile 编写优化
- rk键盘快捷键快捷键不一致_为什么其他键盘语言的键盘快捷键和可访问性很少起作用...
- BackTrack5(BT5)及BT5支持网卡列表
- 【智能医疗】人工智能通过模拟疾病进程可预测老年痴呆
- 关于51单片机按键防抖的一个思考
热门文章
- [译] 白雪公主如何帮助 Airbnb 证明在设计中最重要的技能是讲故事
- OA系统如何打造集团多业务管理平台
- C语言 使用指针遍历数组 - C语言零基础入门教程
- 牛客面试必考真题【算法篇】高频Top200 题目汇总
- pycharm 激活码使用
- ajax异步修改新闻状态,ajax同步刷新
- 区块链软件 NFT游戏开发对战游戏
- 动态口令卡(口令牌)原理解读
- 怎么在服务器里做一个金币系统,如何在Reworld里存储玩家的金币
- “京东金融”改名“京东数科”,这才是真实的京东金融梦