步骤

权限在application中注册

Source code    
  1. <provider
  2. android:name=".BatchPrivoder"
  3. android:authorities="cn.example.providers.batchProvider"
  4. android:exported="true"
  5. >
  6. </provider>

在app的包名下或者子包中自定义contentProvider

Source code    
  1. package com.example.nfcassistant;
  2. import com.example.engine.DBOpenHelper;
  3. import android.content.ContentProvider;
  4. import android.content.ContentUris;
  5. import android.content.ContentValues;
  6. import android.content.UriMatcher;
  7. import android.database.Cursor;
  8. import android.database.sqlite.SQLiteDatabase;
  9. import android.net.Uri;
  10. /**
  11. * contentProvider 作为系统的组件应该放在应用的包下com.example.nfcassistant;,或者子包下 必须在配置文件中注册
  12. * <provider android:name=".BatchPrivoder"
  13. * android:authorities="cn.example.providers.batch" > </provider>
  14. *
  15. * @author ming
  16. *
  17. */
  18. public class BatchPrivoder extends ContentProvider {
  19. DBOpenHelper dbOpenHelper;
  20. // 实例化一个工具类用来验证出入的路径是否匹配,UriMatcher.NO_MATCH默认的不匹配时的状态码,其实就是-1
  21. private static final UriMatcher MATCHER = new UriMatcher(
  22. UriMatcher.NO_MATCH);
  23. private static final int BATCHS = 1;// 定义一个状态码,判断路径是否是对应batch
  24. private static final int BATCH = 2;// 定义一个状态码,判断路径是否是对应
  25. // 操作静态类应该用静态代码块
  26. static {
  27. MATCHER.addURI("cn.example.providers.batchProvider", "batch", BATCHS);// 路径是batch这种的一般是匹配全部,BATCHS匹配的时候返回的状态吗
  28. MATCHER.addURI("cn.example.providers.batchProvider", "batch/#", BATCH);// 路径是batch这种的一般是匹配某一个,BATCH匹配的时候返回的状态吗
  29. }
  30. @Override
  31. public int delete(Uri uri, String selection, String[] selectionArgs) {
  32. int num = 0;
  33. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  34. switch (MATCHER.match(uri)) {
  35. case 1:// 删除全部
  36. num = db.delete("tbl_batch", selection, selectionArgs);
  37. break;
  38. case 2:// 删除对应的
  39. long rowid = ContentUris.parseId(uri);// 通过这个方法得到uri路径最后要具体操作的id
  40. String where = "DeviceId=" + rowid;// 拼接where语句
  41. System.out.println(where);
  42. if (selection != null && !"".equals(selection.trim())) {
  43. where = where + " and " + selection;// 当传进来的where条件不为空是,和当前的条件拼接
  44. }
  45. num = db.delete("tbl_batch", where, selectionArgs);
  46. break;
  47. default:
  48. throw new IllegalArgumentException("这是一个未知的路径" + uri);// 当不匹配的时候抛出非法参数例外
  49. }
  50. return num;
  51. }
  52. /**
  53. * 设置内容的格式
  54. *
  55. * @param uri
  56. * @return
  57. */
  58. @Override
  59. public String getType(Uri uri) {
  60. // TODO Auto-generated method stub
  61. return null;
  62. }
  63. /**
  64. * uri:传入的应该判断是否匹配 values 要插入的值
  65. */
  66. @Override
  67. public Uri insert(Uri uri, ContentValues values) {
  68. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  69. switch (MATCHER.match(uri)) {// 验证传入的uri通过实例化的工具类
  70. case 1:// 符合:content://cn.example.providers.batchProvider/batch
  71. // 这种路径的因为是要向batch表中插入数据
  72. long rowid = db.insert("tbl_batch", "DeviceId", values);// DeviceId当values出入NULL的时候,就向DeviceId字段传入null
  73. // rowid 当表有自增长的主键ID时,返回的rowid就是主键
  74. // contentProvider的insert要求返回一个Uri,这个Uri应该代表插入的这这条数据所以应该组拼一条Uri
  75. // content://cn.example.providers.batch/batch/rowid
  76. Uri insertUri = Uri
  77. .parse("content://cn.example.providers.batchProvider/batch"
  78. + rowid);
  79. // 或者使用一个工具类直接组装
  80. // Uri insertUri = ContentUris.withAppendedId(uri, rowid);
  81. // 推荐使用这种,和上边的效果是一样的
  82. System.out
  83. .println("content://cn.example.providers.batchProvider/batch"
  84. + rowid);
  85. return insertUri;
  86. default:
  87. throw new IllegalArgumentException("这是一个位置的路径" + uri);// 当不匹配的时候抛出非法参数例外
  88. }
  89. }
  90. /**
  91. * 初始化工作 比如得到数据库操作对象
  92. *
  93. * @return
  94. */
  95. @Override
  96. public boolean onCreate() {
  97. dbOpenHelper = new DBOpenHelper(this.getContext());
  98. return true;
  99. }
  100. @Override
  101. public Cursor query(Uri uri, String[] projection, String selection,
  102. String[] selectionArgs, String sortOrder) {
  103. Cursor num;
  104. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  105. switch (MATCHER.match(uri)) {
  106. case 1:// 查询全部
  107. num = db.query("tbl_batch", projection, selection, selectionArgs,
  108. null, null, sortOrder);
  109. break;
  110. case 2:// 查询对应的
  111. long rowid = ContentUris.parseId(uri);// 通过这个方法得到uri路径最后要具体操作的id
  112. String where = "DeviceId=" + rowid;// 拼接where语句
  113. System.out.println(where);
  114. if (selection != null && !"".equals(selection.trim())) {
  115. where = where + " and " + selection;// 当传进来的where条件不为空是,和当前的条件拼接
  116. }
  117. num = db.query("tbl_batch",projection , where, selectionArgs, null, null, sortOrder);
  118. break;
  119. default:
  120. throw new IllegalArgumentException("这是一个未知的路径" + uri);// 当不匹配的时候抛出非法参数例外
  121. }
  122. return num;
  123. }
  124. @Override
  125. public int update(Uri uri, ContentValues values, String selection,
  126. String[] selectionArgs) {
  127. int num = 0;
  128. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  129. switch (MATCHER.match(uri)) {
  130. case 1:// 删除全部
  131. num = db.update("tbl_batch", values, selection, selectionArgs);
  132. break;
  133. case 2:// 删除对应的
  134. long rowid = ContentUris.parseId(uri);// 通过这个方法得到uri路径最后要具体操作的id
  135. String where = "DeviceId=" + rowid;// 拼接where语句
  136. System.out.println(where);
  137. if (selection != null && !"".equals(selection.trim())) {
  138. where = where + " and " + selection;// 当传进来的where条件不为空是,和当前的条件拼接
  139. }
  140. num = db.update("tbl_batch", values, selection, selectionArgs);
  141. break;
  142. default:
  143. throw new IllegalArgumentException("这是一个未知的路径" + uri);// 当不匹配的时候抛出非法参数例外
  144. }
  145. return num;
  146. }
  147. }

在其他app中测试

Source code    
  1. package com.example.testcontentprovider;
  2. import android.app.Activity;
  3. import android.content.ContentResolver;
  4. import android.content.ContentValues;
  5. import android.database.Cursor;
  6. import android.net.Uri;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.Menu;
  10. import android.view.MenuItem;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. public class MainActivity extends Activity {
  15. Button button;
  16. Button del;
  17. Button query;
  18. Button updata;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. button = (Button) findViewById(R.id.button1);
  24. button.setOnClickListener(new OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. // TODO Auto-generated method stub
  28. Uri uri = Uri
  29. .parse("content://cn.example.providers.batchProvider/batch");
  30. // 要的到contentProvider应该通过下面的这个类
  31. ContentResolver resolver = getContentResolver();// 通过上下文
  32. ContentValues values = new ContentValues();
  33. values.put("DeviceId", "121");
  34. values.put("Codes", "ss");
  35. values.put("DeviceName", "牛皮纸");
  36. values.put("Price", "15");
  37. values.put("Custodian", "妮妮");
  38. values.put("End_user", "asd");
  39. values.put("Time", "19956565");
  40. resolver.insert(uri, values);
  41. }
  42. });
  43. del = (Button) findViewById(R.id.button2);
  44. del.setOnClickListener(new OnClickListener() {
  45. @Override
  46. public void onClick(View v) {
  47. // TODO Auto-generated method stub
  48. Uri uri = Uri
  49. .parse("content://cn.example.providers.batchProvider/batch/121");
  50. // 要的到contentProvider应该通过下面的这个类
  51. ContentResolver resolver = getContentResolver();// 通过上下文
  52. System.out.println("删除");
  53. resolver.delete(uri, null, null);
  54. }
  55. });
  56. query = (Button) findViewById(R.id.button3);
  57. query.setOnClickListener(new OnClickListener() {
  58. @Override
  59. public void onClick(View v) {
  60. // TODO Auto-generated method stub
  61. Uri uri = Uri
  62. .parse("content://cn.example.providers.batchProvider/batch/333");
  63. // 要的到contentProvider应该通过下面的这个类
  64. ContentResolver resolver = getContentResolver();// 通过上下文
  65. Cursor cursor = resolver
  66. .query(uri, null, null, null, "_id asc");
  67. cursor.moveToFirst();
  68. String id = cursor.getString(cursor.getColumnIndex("DeviceId"));
  69. System.out.println("id等于" + id);
  70. String tag = "id等于";
  71. Log.i(tag, id);
  72. }
  73. });
  74. updata = (Button) findViewById(R.id.button4);
  75. updata.setOnClickListener(new OnClickListener() {
  76. @Override
  77. public void onClick(View v) {
  78. // TODO Auto-generated method stub
  79. Uri uri = Uri
  80. .parse("content://cn.example.providers.batchProvider/batch/333");
  81. // 要的到contentProvider应该通过下面的这个类
  82. ContentResolver resolver = getContentResolver();// 通过上下文
  83. ContentValues values = new ContentValues();
  84. values.put("Time", "121");
  85. resolver.update(uri, values, null, null);
  86. }
  87. });
  88. }
  89. @Override
  90. public boolean onCreateOptionsMenu(Menu menu) {
  91. // Inflate the menu; this adds items to the action bar if it is present.
  92. getMenuInflater().inflate(R.menu.main, menu);
  93. return true;
  94. }
  95. @Override
  96. public boolean onOptionsItemSelected(MenuItem item) {
  97. // Handle action bar item clicks here. The action bar will
  98. // automatically handle clicks on the Home/Up button, so long
  99. // as you specify a parent activity in AndroidManifest.xml.
  100. int id = item.getItemId();
  101. if (id == R.id.action_settings) {
  102. return true;
  103. }
  104. return super.onOptionsItemSelected(item);
  105. }
  106. }

设置type

监听内容提供者数据变化

1,A应用更改数据

2,内容提供者发送内容更改通知

this.getContext().getContentResolver().notifyChange(uri,null);

哪条数据被更改,null,就是给所有发通知

3.得到通知的应用,做出相应

select * from person orer by persionid desc limit 1

得到最后加入的数据

contentProvider内容提供者的更多相关文章

  1. Android组件系列----ContentProvider内容提供者

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. android 53 ContentProvider内容提供者

    ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...

  3. android contentprovider内容提供者

    contentprovider内容提供者:让其他app可以访问私有数据库(文件) 1.AndroidManifest.xml 配置provider <?xml version="1.0 ...

  4. Android组件系列----ContentProvider内容提供者【1】

    [正文] 一.ContentProvider简单介绍: ContentProvider内容提供者(四大组件之中的一个)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider能 ...

  5. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

  6. contentProvider 内容提供者

    http://blog.csdn.net/woshixuye/article/details/8280879 实例代码当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定 ...

  7. Android -- ContentProvider 内容提供者,创建和调用

    1. 概述 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentPr ...

  8. Android 进阶11:进程通信之 ContentProvider 内容提供者

    学习启舰大神,每篇文章写一句励志的话,与大家共勉. When you are content to be simply yourself and don't compare or compete, e ...

  9. Android组件系列----ContentProvider内容提供者【4】

    (4)单元測试类: 这里须要涉及到另外一个知识:ContentResolver内容訪问者. 要想訪问ContentProvider.则必须使用ContentResolver. 能够通过ContentR ...

随机推荐

  1. cxiamge 使用静态库 vs2010

    首先下载cxiamge,我使用的是cxiamge_702 下载地址:http://download.csdn.net/detail/xing_ping_1987/8085129 编译静态库 新建项目, ...

  2. Ecshop导航栏标题栏的伪静态设置

    当Ecshop的伪静设置成功之后,左侧的分类标签,包括具体的产品页面都可以顺利的打开伪静态页面,但是点击导航栏,或者标题栏的时候,却还是之前的数据库标签页的方式,这是怎么一回事呢? 这是由于,Ecsh ...

  3. sublime text 发现一个超好的编辑器

    垂直竖行多行编辑 鼠标中建拖动或 shift+右键拖动 切换文件 ctrl+p 输入文件名 可以拖动项目文件夹到sublime text左栏, 也可文件--打开文件夹--项目所在文件夹,但会在新窗口中 ...

  4. 使用 OpenWrt Image Generator 为 WR703N 路由器定制固件

    标题:使用 OpenWrt Image Generator 为 WR703N 路由器定制固件 之前试着自己编译固件,编译是成功了,但是在后期安装官方仓库的ipk时出现问题,因为自己编译的固件和官方固件 ...

  5. hadoop学习之hadoop完全分布式集群安装

    注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流.转载请注明来自: http://blog.csdn.net/ab198604/article/details/8250461 要想深入的 ...

  6. 配置Kestrel 网址Urls

    配置Kestrel 网址Urls ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Ur ...

  7. 如何在Latex上裁减图片

    在Latex的使用过程中,很多人需要载入一些具有一定白边或者边框的图片.特别是用matlab生成的很多图片.大部分人的做法是通过使用pdf工具去裁减.这样做很麻烦,并且对于一些批量的,大小相同的图片而 ...

  8. 全局函数的Result一定要每次都初始化,否则上次的结果会被保持到下一次继续使用

    测试半天,原来是因为这个原因.下面例子中,Result:=''必须写,否则其结果会被累计,真是昏倒!! function MyPaths(tache: IXMLTaskType) : String; ...

  9. OpenWRT 编译 error GNU libiconv not in use but included iconv.h is from...

    OpenWRT 编译 error GNU libiconv not in use but included iconv.h is from... 编译的时候碰到一个常见的错误,但是却在一个陌生的地方爆 ...

  10. REVERSE关键字之REVERSE索引

    昨天说到REVERSE关键字可以指REVERSE函数和REVERSE索引,简单介绍了下REVERSE函数的含义,今天简单整理下REVERSE索引. REVERSE索引也是一种B树索引,但它物理上将按照 ...