当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。以前我们学习过文件的操作模式,通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样可以对外共享数据,但数据的访问方式会因数据存储的方式而不同,如:采用xml文件对外共享数据,需要进行xml解析来读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

1.第一步需要继承ContentProvider并重写下面方法:

public class PersonContentProvider extends ContentProvider{

public boolean onCreate()

public Uri insert(Uri uri, ContentValues values)

public int delete(Uri uri, String selection, String[] selectionArgs)

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

public String getType(Uri uri)}

2. 第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:

<manifest .... >

<application android:icon="@drawable/icon" android:label="@string/app_name">

<provider android:name=".UserProvider" android:authorities="com.example.providerdemo.userProvider"/>

</application>

</manifest>

注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。

ProviderDemo 拥有DB, 提供Provider,供外围进行增删改查。 (这里可以类比通讯录)

OneApp对他进行 操作

provider定义:

/**
*
*/
package com.example.providerdemo; 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; /**
*
* @author baoxing.gbx
* @version $Id: UserProvider.java, v 0.1 2015年8月21日 上午10:25:48 baoxing.gbx Exp $
*/
public class UserProvider extends ContentProvider{ private DBopenHelper dbOpenHelper;
private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int UserOne = 1;
private static final int UserList = 2;
static{
MATCHER.addURI("com.example.providerdemo.userProvider", "user", UserList);
MATCHER.addURI("com.example.providerdemo.userProvider", "user/#", UserOne);
} @Override
public boolean onCreate() {
dbOpenHelper = new DBopenHelper(this.getContext());
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case UserOne:
long key = ContentUris.parseId(uri);
String where = "id = "+ key;
if(selection!=null && !"".equals(selection.trim())){
where += " and "+ selection;
}
Cursor cursor = db.query("user", null, where, selectionArgs, null, null, null, null);
return cursor;
case UserList:
cursor = db.query("user", null, null, selectionArgs, null, null, null, null);
return cursor;
default:
throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
}
} @Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case UserOne:
long rowid = db.insert("user", "", values);//主键值
Uri insertUri = ContentUris.withAppendedId(uri, rowid);
this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知
return insertUri; default:
throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
}
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
int nnum = 0;
switch (MATCHER.match(uri)) { case UserOne:
long key = ContentUris.parseId(uri);
String where = "id = " + key;
if (null != selection && !"".equals(selection)) {
where += "and " + selection;
}
nnum = db.delete("user", where, selectionArgs);
return nnum; case UserList:
nnum = db.delete("user", selection, selectionArgs);
return nnum; default:
throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
}
} @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
int nnum = 0 ;
switch (MATCHER.match(uri)) {
case UserOne:
long key = ContentUris.parseId(uri);
String where = "id = " + key;
if (null != selection && !"".equals(selection)) {
where += "and " + selection;
}
nnum = db.update("user", values, where, selectionArgs);
return nnum; case UserList: nnum = db.update("user", values, selection, selectionArgs);
return nnum;
default:
throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
}
} }

  

DB操作:

package com.example.providerdemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.nfc.Tag;
import android.os.Build.VERSION;
import android.util.Log; /**
*
* @author baoxing.gbx
* @version $Id: DBopenHelper.java, v 0.1 2015年7月11日 下午9:39:03 baoxing.gbx Exp $
*/
public class DBopenHelper extends SQLiteOpenHelper{ /** 数据库名称 */
private static final String DB_NAME = "test.db"; private static final int VERSION = 1; private static final String Tag = "DBopenHelper"; // 初始化数据库开启装置
public DBopenHelper(Context context) {
super(context, DB_NAME, null, VERSION);
// TODO Auto-generated constructor stub
} //
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(Tag, "onCreate 被调用");
db.execSQL("create table user (id integer primary key autoincrement, name varchar(20),sex varchar(20), age integer )");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(Tag, "onUpgrade 被调用");
db.execSQL("DROP TABLE IF EXISTS person");
onCreate(db);
} }

  

OneApp测试

/**
*
*/
package com.demo.oneapp.test; import java.util.Date; import android.R.integer;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log; /**
*
* @author baoxing.gbx
* @version $Id: TestProvider.java, v 0.1 2015年8月20日 下午8:50:13 baoxing.gbx Exp $
*/
public class TestProvider extends AndroidTestCase { public void testAdd() {
Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user");
ContentResolver resolver = this.getContext().getContentResolver(); for (int i = 0; i < 10; ++i) {
ContentValues values = new ContentValues();
values.put("name", "muyou" + i);
values.put("sex", "男");
values.put("age", 18 + i);
Uri uri2 = resolver.insert(uri, values);
System.out.println("完成:" + uri2);
}
} public void testDel() {
// 查询单个
Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2");
ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery",
"id="+ id + "name=" + name + "sex=" + sex + "age=" + age);
} uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2");
resolver = this.getContext().getContentResolver();
resolver.delete(uri, null, null); // 查询单个
uri = Uri.parse("content://com.example.providerdemo.userProvider/user/2");
resolver = this.getContext().getContentResolver(); cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery",
"id="+ id + "name=" + name + "sex=" + sex + "age=" + age);
}
} public void testUpdate() {
// 查询单个
Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3");
ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery",
"id="+ id + "name=" + name + "sex=" + sex + "age=" + age);
} uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3");
resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "cool");
resolver.update(uri, values, null, null); // 查询单个
uri = Uri.parse("content://com.example.providerdemo.userProvider/user/3");
resolver = this.getContext().getContentResolver(); cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery",
"id="+ id + "name=" + name + "sex=" + sex + "age=" + age);
}
} public void testQuery() { // 查询所有
Uri uri = Uri.parse("content://com.example.providerdemo.userProvider/user");
ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery",
"id="+ id + "name=" + name + "sex=" + sex + "age=" + age);
} // 查询单个
uri = Uri.parse("content://com.example.providerdemo.userProvider/user/5");
resolver = this.getContext().getContentResolver(); cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i("testQuery",
"id="+ id + "name=" + name + "sex=" + sex + "age=" + age);
}
} }

  

Android ContentProvider 简单学习的更多相关文章

  1. 一、Android四大框架之ContentProvider的学习与运用,实现SQLite的增删改查。

    本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处! ContentProvider的学习与运用 Alpha Dog 2016-04-13  10:27:06 首先,项目的地址:https:// ...

  2. 简单说说Android自定义view学习推荐的方式

    这几天比较受关注,挺开心的,嘿嘿. 这里给大家总结一下学习自定义view的一些技巧.  以后写自定义view可能不会写博客了,但是可以开源的我会把源码丢到github上我的地址:https://git ...

  3. Android 实现简单音乐播放器(一)

    今天掐指一算,学习Android长达近两个月了,今天开始,对过去一段时间的学习收获以及遇到的疑难杂症做一些总结. 简单音乐播放器是我自己完成的第一个功能较为完整的APP,可以说是我的Android学习 ...

  4. Android开发新手学习总结(一)——使用Android Studio搭建Android集成开发环境

    [新手连载]一:使用Android Studio搭建Android集成开发环境http://bbs.itcast.cn/forum.php?mod=viewthread&tid=87055&a ...

  5. Android开发最佳学习路线图

          为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们 ...

  6. Android] Android XML解析学习——方式比较

     [Android] Android XML解析学习——方式比较 (ZT)  分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...

  7. Android开发该学习哪些东西?

    开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...

  8. Android之Wifi学习(1)

    在Android中对Wifi操作,android本身提供了一些实用的包.在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanResult,wifiConfigurat ...

  9. android Glide简单使用

    版权声明:大家可以转载,请写明转载申明 https://blog.csdn.net/bzlj2912009596/article/details/81702367 今天,简单讲讲Android里Gli ...

随机推荐

  1. SHARE NOTHING SHARE EVERYTHING

    http://mp.weixin.qq.com/s?__biz=MjM5ODYwMjI2MA==&mid=2649736156&idx=1&sn=23931f48282f6ef ...

  2. java json与对象或者集合互转

    package open_exe; public class User { private int id; private String name; private String gender; pu ...

  3. request.querystring和request.form、session的区别

    1. request.querystring是用来接收地址里面问号“?”后面的参数的内容,  用get方法读取的 不安全   request.form是用来接收表单递交来的数据 ,是用post方法读取 ...

  4. How to prevent SQL injection attacks?

    In our earlier tutorial on SQL Injection, one way to have prevented the SQL injection attack was by ...

  5. FPGA学习笔记之格雷码、边沿检测、门控时钟

    一.格雷码 格雷码的优点主要是进位时只有一位跳变,误码率低. 1.二进制转格雷码 我们观察下表: 二进制码 格雷码 00 00 01 01 10 11 11 10 二进制码表示为B[],格雷码表示为G ...

  6. Oracle 参数之_small_table_threshold

    SQL> select * from v$version; BANNER ------------------------------------------------------------ ...

  7. [Android Tips] 2. Disable recent apps dialog on long press home button

    public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d(&qu ...

  8. 结合WebSocket编写WebGL综合场景示例

    在WebGL场景中导入多个Babylon骨骼模型,在局域网用WebSocket实现多用户交互控制. 首先是场景截图: 上图在场景中导入一个Babylon骨骼模型,使用asdw.空格.鼠标控制加速度移动 ...

  9. JavaScript读二进制文件并用ajax传输二进制流

    综合网上多个教程,加上自己实践得出的方法,目前能够兼容谷歌.IE11.IE10. htmlbody里的内容,没什么特殊的. <div id="dConfirm"> &l ...

  10. 用JS来控制 div的高度随浏览器变化而变化

    <div id="test" style=" border: solid 1px #f00; "></div> <script t ...