使用ContentProvider共享数据

独占 共享

XML 文本 二进制文件 数据量大(数据库,开源)  这些都是进程独享的 / Content Provider 可以进程共享

1.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 manifest中对<provider>配置,采用authorities(主机名)唯一标识

<provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/>

**ContentProvider(内容提供者)的Scheme为content://

Uri要操作的数据;路径(path)

**要操作的数据不一定来自数据库,也可以是文件等他存储方式

用于操作Uri的工具类:UriMatcher和ContentUris

UriMatcher

a.注册需要匹配的Uri路径

//UriMatcher.NO_MATCH——不匹配任何路径的返回码
UriMatcher mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);

** cn.itcast.provider.personprovider 主机唯一标识

person 表名 # 通配符

2 匹配码

b.用mMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码(可用switch-case进行判断)

private static final UriMatcher sURLMatcher = new UriMatcher(
            UriMatcher.NO_MATCH);

static {
  sURLMatcher.addURI("com.android.alarmclock", "alarm", ALARMS);
   sURLMatcher.addURI("com.android.alarmclock", "alarm/#", ALARMS_ID);}

ContentUris

获取Uri路径后面的ID部分,它有两个比较实用的方法

withAppendedId(uri, id)用于为路径加上ID部分:

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")
Uri resultUri = ContentUris.withAppendedId(uri, 10); 

**生成后的Uri为:content://cn.itcast.provider.personprovider/person/10

parseId(uri)方法用于从路径中获取ID部分:

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);

**获取的结果为:10

使用ContentResolver操作ContentProvider中的数据

1.想让外部其他应用能够对本应用进行增删改查,就覆盖ContentProvider的insert(),delete(),update(),query()方法。

2.外部应用访问ContentProvider,通过ContentResolver调用ContentProvider内部的增删改查方法来进行修改查询数据,也就是调用覆盖过的insert(),delete(),update(),query()这些方法。

**ContentProvider在第一次访问时才创建。

//允许其他应用向内容提供者插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  switch (MATCHER.match(uri)) {
  case 1:
    long rowId =db.insert("person", "name", values); //"name"防止values为null
    Uri appenduri =ContentUris.withAppendedId(uri, rowId); //根据id构造新的uri
    return appenduri;

  //传入参数uri错误
  default:
    throw new IllegalArgumentException("unkown uri");
  }
}

//其他应用
public void testInsert() {
  Uri uri = Uri.parse("");
  ContentResolver resolver = this.getContext().getContentResolver();
  ContentValues values = new ContentValues();
  values.put("name", "lyj");
  values.put("phone", "15032325144");
  // 访问内容提供者的insert方法=>也就是调用PersonProvider的insert(Uri uri, ContentValues values)方法
  resolver.insert(uri, values);
}

3 提取路径uri中的id

ContentUris.parseId(uri)

*星号代表所有字符 #警号代表数字

监听ContentProvider中内容变化

A应用向ContentProvider添加一条数据,ContentProvider发出数据变化通知,B应用监听ContentProvider的变化,此时B应用就知道ContentProvider发生变化。

@Override
public Uri insert(Uri uri, ContentValues values) {
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  switch (MATCHER.match(uri)) {
  case 1:
    long rowId = db.insert("person", "name", values); // "name"防止values为null
    Uri appenduri = ContentUris.withAppendedId(uri, rowId); // 根据id构造新的uri
    this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知
    return appenduri;

  // 传入参数uri错误
  default:
    throw new IllegalArgumentException("unkown uri");
  }
}
时间: 2024-08-14 02:25:55

使用ContentProvider共享数据的相关文章

ContentProvider共享数据的使用

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

ContentProvider共享数据

  1.ContentProvider 一般服务端设置共享数据, 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 当应用需

安卓实训第十四天---使用ContentProvider共享数据,并且利用ContentResolver监听共享数据

ContentProvider: 一.当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 第二步需要在AndroidManif

第六章 访问ContentProvider共享数据

内容提供器Content Provider       //Provider    n. 供应者:养家者 主要用于在不同的应用程序之间实现数据共享功能 用法:    1.使用现有的内容提供器来读取和操作相应程序中的数据 通过ContentResolver实现增删改查. //resolver  n. 溶剂:[电子] 分解器:下决心者 ContentResolver contentResolver = context.getContentResolver 通过URI来指明所要操作的数据: 增删改查方

android 应用间共享数据,调用其他app数据资源

1.通过获取相同shareUserId的context 1)相同shareUserId,不同进程,shareUserId 和 lunix进程的uid不是同一概念. 2)相同shareUserId,相同进程 资源共享原理分析. 2.contentprovider 共享数据 参看网址: Android PackageManagerService分析一:PMS的启动

Android共享数据 ContentProvider 的使用

ContentResolver 与 ContentProvider 的作用 ContentProvider 负责: 组织应用程序数据 向其他应用程序提供共享数据 ContentResolver 负责 获取ContentProvider提供的数据 增删改查 数据 让自己的数据和其它应用程序共享有两种方式:创建自己的Content Provider (即继承自Content Provider的子类) 或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

Android学习笔记二十二.使用ContentProvider实现数据共享(五).监听ContentProvider的数据改变

一.使用ContentProvider管理多媒体内容 Android提供了Camera程序来支持拍照.拍摄视频,用户拍摄的相片.视频都将存放在固定的位置.Android同样为这些多媒体内容提供了ContentProvider,所以我们可以通过使用ContentProvider实现其他应用直接访问Camera所拍摄的照片.视频等. 1.多媒体ContentProvider的Uri (1)MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡

Android开发中多进程共享数据

# 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用.我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让app打开同一个SharedPreferences读取数据就可以了.但是在实际的测试中,我们发现推送进程存入的数据,并不能在app进程中获得.所以这是为什么呢,也许聪明的读者从我们上面的陈述中已经发现了原因,因为我们有两个进程,推送进程负责将推送数据存入,而app进程负责读取,但是正是由于是两个进程,如