步骤

权限在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. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  2. Jquery 中 $('obj').attr('checked',true)失效的几种解决方案

    转载自:搜狐博客 大拙无为 1.$('obj').prop('checked',true) 2. $(':checkbox').each(function(){ this.checked=true; ...

  3. Java笔记--File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别

    转自:http://hi.baidu.com/danghj/item/0ef2e2c4ab95af7489ad9e39 参考资料:  < core java > 12 章 使用 Java ...

  4. [CSAPP]并发与并行

    学了这么久的计算机,并发与并行的概念理解的一直不够透彻.考研复习那会儿,以为自己懂了,然而直到看了CSAPP才算是真正明白了这俩个概念. 并发(concurrency) 流X和流Y并发运行是指,流X在 ...

  5. OC和C语言的混编注意点和好处

    苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...

  6. qemu cow镜像分析

    最近研究了以下qemu最简单的read on direct 镜像格式cow,在稀疏文件的模式下,这种方式还是比较简单,而且有优势的.其优势主要体现在云计算环境中,不需要用到qcow2的那些诸如内部快照 ...

  7. 安装Oracle10g on RedHat as 4 64bit(摘)

    一.安装前的配置 1.修改RH版本 vi /etc/redhat-release Red Hat Enterprise Linux AS release 3 (Taroon Update 3) 2. ...

  8. Qt5+VS2013兼容XP方法

    用Qt5+VS2013编译程序默认配置会在XP运行时报"不是有效的Win32程序"工作需要必须要XP运行 pro文件中加一句: 复制代码 QMAKE_LFLAGS_WINDOWS ...

  9. DBA 经典面试题(3)

    这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度.   1.解释冷备份和热备份的不 ...

  10. BackgroundWorker用法

    BackgroundWorker主要用来提供后台运算服务(防止用户前台无响应等待),并提供服务进度的类: 代码如下: BackgroundWorker bgw = new BackgroundWork ...