contentProvider内容提供者
步骤
权限在application中注册
- <provider
- android:name=".BatchPrivoder"
- android:authorities="cn.example.providers.batchProvider"
- android:exported="true"
- >
- </provider>
在app的包名下或者子包中自定义contentProvider
- package com.example.nfcassistant;
- import com.example.engine.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;
- /**
- * contentProvider 作为系统的组件应该放在应用的包下com.example.nfcassistant;,或者子包下 必须在配置文件中注册
- * <provider android:name=".BatchPrivoder"
- * android:authorities="cn.example.providers.batch" > </provider>
- *
- * @author ming
- *
- */
- public class BatchPrivoder extends ContentProvider {
- DBOpenHelper dbOpenHelper;
- // 实例化一个工具类用来验证出入的路径是否匹配,UriMatcher.NO_MATCH默认的不匹配时的状态码,其实就是-1
- private static final UriMatcher MATCHER = new UriMatcher(
- UriMatcher.NO_MATCH);
- private static final int BATCHS = 1;// 定义一个状态码,判断路径是否是对应batch
- private static final int BATCH = 2;// 定义一个状态码,判断路径是否是对应
- // 操作静态类应该用静态代码块
- static {
- MATCHER.addURI("cn.example.providers.batchProvider", "batch", BATCHS);// 路径是batch这种的一般是匹配全部,BATCHS匹配的时候返回的状态吗
- MATCHER.addURI("cn.example.providers.batchProvider", "batch/#", BATCH);// 路径是batch这种的一般是匹配某一个,BATCH匹配的时候返回的状态吗
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- int num = 0;
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (MATCHER.match(uri)) {
- case 1:// 删除全部
- num = db.delete("tbl_batch", selection, selectionArgs);
- break;
- case 2:// 删除对应的
- long rowid = ContentUris.parseId(uri);// 通过这个方法得到uri路径最后要具体操作的id
- String where = "DeviceId=" + rowid;// 拼接where语句
- System.out.println(where);
- if (selection != null && !"".equals(selection.trim())) {
- where = where + " and " + selection;// 当传进来的where条件不为空是,和当前的条件拼接
- }
- num = db.delete("tbl_batch", where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("这是一个未知的路径" + uri);// 当不匹配的时候抛出非法参数例外
- }
- return num;
- }
- /**
- * 设置内容的格式
- *
- * @param uri
- * @return
- */
- @Override
- public String getType(Uri uri) {
- // TODO Auto-generated method stub
- return null;
- }
- /**
- * uri:传入的应该判断是否匹配 values 要插入的值
- */
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (MATCHER.match(uri)) {// 验证传入的uri通过实例化的工具类
- case 1:// 符合:content://cn.example.providers.batchProvider/batch
- // 这种路径的因为是要向batch表中插入数据
- long rowid = db.insert("tbl_batch", "DeviceId", values);// DeviceId当values出入NULL的时候,就向DeviceId字段传入null
- // rowid 当表有自增长的主键ID时,返回的rowid就是主键
- // contentProvider的insert要求返回一个Uri,这个Uri应该代表插入的这这条数据所以应该组拼一条Uri
- // content://cn.example.providers.batch/batch/rowid
- Uri insertUri = Uri
- .parse("content://cn.example.providers.batchProvider/batch"
- + rowid);
- // 或者使用一个工具类直接组装
- // Uri insertUri = ContentUris.withAppendedId(uri, rowid);
- // 推荐使用这种,和上边的效果是一样的
- System.out
- .println("content://cn.example.providers.batchProvider/batch"
- + rowid);
- return insertUri;
- default:
- throw new IllegalArgumentException("这是一个位置的路径" + uri);// 当不匹配的时候抛出非法参数例外
- }
- }
- /**
- * 初始化工作 比如得到数据库操作对象
- *
- * @return
- */
- @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) {
- Cursor num;
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (MATCHER.match(uri)) {
- case 1:// 查询全部
- num = db.query("tbl_batch", projection, selection, selectionArgs,
- null, null, sortOrder);
- break;
- case 2:// 查询对应的
- long rowid = ContentUris.parseId(uri);// 通过这个方法得到uri路径最后要具体操作的id
- String where = "DeviceId=" + rowid;// 拼接where语句
- System.out.println(where);
- if (selection != null && !"".equals(selection.trim())) {
- where = where + " and " + selection;// 当传进来的where条件不为空是,和当前的条件拼接
- }
- num = db.query("tbl_batch",projection , where, selectionArgs, null, null, sortOrder);
- break;
- default:
- throw new IllegalArgumentException("这是一个未知的路径" + uri);// 当不匹配的时候抛出非法参数例外
- }
- return num;
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- int num = 0;
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (MATCHER.match(uri)) {
- case 1:// 删除全部
- num = db.update("tbl_batch", values, selection, selectionArgs);
- break;
- case 2:// 删除对应的
- long rowid = ContentUris.parseId(uri);// 通过这个方法得到uri路径最后要具体操作的id
- String where = "DeviceId=" + rowid;// 拼接where语句
- System.out.println(where);
- if (selection != null && !"".equals(selection.trim())) {
- where = where + " and " + selection;// 当传进来的where条件不为空是,和当前的条件拼接
- }
- num = db.update("tbl_batch", values, selection, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("这是一个未知的路径" + uri);// 当不匹配的时候抛出非法参数例外
- }
- return num;
- }
- }
在其他app中测试
- package com.example.testcontentprovider;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- Button button;
- Button del;
- Button query;
- Button updata;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button) findViewById(R.id.button1);
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Uri uri = Uri
- .parse("content://cn.example.providers.batchProvider/batch");
- // 要的到contentProvider应该通过下面的这个类
- ContentResolver resolver = getContentResolver();// 通过上下文
- ContentValues values = new ContentValues();
- values.put("DeviceId", "121");
- values.put("Codes", "ss");
- values.put("DeviceName", "牛皮纸");
- values.put("Price", "15");
- values.put("Custodian", "妮妮");
- values.put("End_user", "asd");
- values.put("Time", "19956565");
- resolver.insert(uri, values);
- }
- });
- del = (Button) findViewById(R.id.button2);
- del.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Uri uri = Uri
- .parse("content://cn.example.providers.batchProvider/batch/121");
- // 要的到contentProvider应该通过下面的这个类
- ContentResolver resolver = getContentResolver();// 通过上下文
- System.out.println("删除");
- resolver.delete(uri, null, null);
- }
- });
- query = (Button) findViewById(R.id.button3);
- query.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Uri uri = Uri
- .parse("content://cn.example.providers.batchProvider/batch/333");
- // 要的到contentProvider应该通过下面的这个类
- ContentResolver resolver = getContentResolver();// 通过上下文
- Cursor cursor = resolver
- .query(uri, null, null, null, "_id asc");
- cursor.moveToFirst();
- String id = cursor.getString(cursor.getColumnIndex("DeviceId"));
- System.out.println("id等于" + id);
- String tag = "id等于";
- Log.i(tag, id);
- }
- });
- updata = (Button) findViewById(R.id.button4);
- updata.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Uri uri = Uri
- .parse("content://cn.example.providers.batchProvider/batch/333");
- // 要的到contentProvider应该通过下面的这个类
- ContentResolver resolver = getContentResolver();// 通过上下文
- ContentValues values = new ContentValues();
- values.put("Time", "121");
- resolver.update(uri, values, null, null);
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- }
设置type
监听内容提供者数据变化
1,A应用更改数据
2,内容提供者发送内容更改通知
this.getContext().getContentResolver().notifyChange(uri,null);
哪条数据被更改,null,就是给所有发通知
3.得到通知的应用,做出相应
select * from person orer by persionid desc limit 1
得到最后加入的数据
contentProvider内容提供者的更多相关文章
- Android组件系列----ContentProvider内容提供者
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- android 53 ContentProvider内容提供者
ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...
- android contentprovider内容提供者
contentprovider内容提供者:让其他app可以访问私有数据库(文件) 1.AndroidManifest.xml 配置provider <?xml version="1.0 ...
- Android组件系列----ContentProvider内容提供者【1】
[正文] 一.ContentProvider简单介绍: ContentProvider内容提供者(四大组件之中的一个)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider能 ...
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- contentProvider 内容提供者
http://blog.csdn.net/woshixuye/article/details/8280879 实例代码当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定 ...
- Android -- ContentProvider 内容提供者,创建和调用
1. 概述 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentPr ...
- Android 进阶11:进程通信之 ContentProvider 内容提供者
学习启舰大神,每篇文章写一句励志的话,与大家共勉. When you are content to be simply yourself and don't compare or compete, e ...
- Android组件系列----ContentProvider内容提供者【4】
(4)单元測试类: 这里须要涉及到另外一个知识:ContentResolver内容訪问者. 要想訪问ContentProvider.则必须使用ContentResolver. 能够通过ContentR ...
随机推荐
- cxiamge 使用静态库 vs2010
首先下载cxiamge,我使用的是cxiamge_702 下载地址:http://download.csdn.net/detail/xing_ping_1987/8085129 编译静态库 新建项目, ...
- Ecshop导航栏标题栏的伪静态设置
当Ecshop的伪静设置成功之后,左侧的分类标签,包括具体的产品页面都可以顺利的打开伪静态页面,但是点击导航栏,或者标题栏的时候,却还是之前的数据库标签页的方式,这是怎么一回事呢? 这是由于,Ecsh ...
- sublime text 发现一个超好的编辑器
垂直竖行多行编辑 鼠标中建拖动或 shift+右键拖动 切换文件 ctrl+p 输入文件名 可以拖动项目文件夹到sublime text左栏, 也可文件--打开文件夹--项目所在文件夹,但会在新窗口中 ...
- 使用 OpenWrt Image Generator 为 WR703N 路由器定制固件
标题:使用 OpenWrt Image Generator 为 WR703N 路由器定制固件 之前试着自己编译固件,编译是成功了,但是在后期安装官方仓库的ipk时出现问题,因为自己编译的固件和官方固件 ...
- hadoop学习之hadoop完全分布式集群安装
注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流.转载请注明来自: http://blog.csdn.net/ab198604/article/details/8250461 要想深入的 ...
- 配置Kestrel 网址Urls
配置Kestrel 网址Urls ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Ur ...
- 如何在Latex上裁减图片
在Latex的使用过程中,很多人需要载入一些具有一定白边或者边框的图片.特别是用matlab生成的很多图片.大部分人的做法是通过使用pdf工具去裁减.这样做很麻烦,并且对于一些批量的,大小相同的图片而 ...
- 全局函数的Result一定要每次都初始化,否则上次的结果会被保持到下一次继续使用
测试半天,原来是因为这个原因.下面例子中,Result:=''必须写,否则其结果会被累计,真是昏倒!! function MyPaths(tache: IXMLTaskType) : String; ...
- 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... 编译的时候碰到一个常见的错误,但是却在一个陌生的地方爆 ...
- REVERSE关键字之REVERSE索引
昨天说到REVERSE关键字可以指REVERSE函数和REVERSE索引,简单介绍了下REVERSE函数的含义,今天简单整理下REVERSE索引. REVERSE索引也是一种B树索引,但它物理上将按照 ...