0

0

Android内容提供者ContentProvider用法实例分析

高洛峰

高洛峰

发布时间:2017-02-07 16:01:23

|

1195人浏览过

|

来源于php中文网

原创

本文实例讲述了android内容提供者contentprovider用法。分享给大家供大家参考,具体如下:

PersonContentProvider内容提供者类

package com.ljq.db;
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;
import android.text.TextUtils;
/**
 * 内容提供者
 * 
 * 作用:统一数据访问方式,方便外部调用
 * 
 * @author jiqinlin
 * 
 */
public class PersonContentProvider extends ContentProvider {
  // 数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头
  public static final String PERSONS_TYPE = "vnd.android.cursor.dir/person";
  // 单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头
  public static final String PERSONS_ITEM_TYPE = "vnd.android.cursor.item/person";
  public static final String AUTHORITY = "com.ljq.provider.personprovider";// 主机名
  /* 自定义匹配码 */
  public static final int PERSONS = 1;
  /* 自定义匹配码 */
  public static final int PERSON = 2;
  public static final Uri PERSONS_URI = Uri.parse("content://" + AUTHORITY + "/person");
  private DBOpenHelper dbOpenHelper = null;
  // UriMatcher类用来匹配Uri,使用match()方法匹配路径时返回匹配码
  private static final UriMatcher uriMatcher;
  static {
    // 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    // 如果match()方法匹配content://com.ljq.provider.personprovider/person路径,返回匹配码为PERSONS
    uriMatcher.addURI(AUTHORITY, "person", PERSONS);
    // 如果match()方法匹配content://com.ljq.provider.personprovider/person/230路径,返回匹配码为PERSON
    uriMatcher.addURI(AUTHORITY, "person/#", PERSON);
  }
  @Override
  public boolean onCreate() {
    dbOpenHelper = new DBOpenHelper(this.getContext());
    return true;
  }
  @Override
  public Uri insert(Uri uri, ContentValues values){
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    long id = 0;
    switch (uriMatcher.match(uri)) {
    case PERSONS:
      id = db.insert("person", "name", values);// 返回的是记录的行号,主键为int,实际上就是主键值
      return ContentUris.withAppendedId(uri, id);
    case PERSON:
      id = db.insert("person", "name", values);
      String path = uri.toString();
      return Uri.parse(path.substring(0, path.lastIndexOf("/"))+id); // 替换掉id
    default:
      throw new IllegalArgumentException("Unknown URI " + uri);
    }
  }
  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    int count = 0;
    switch (uriMatcher.match(uri)) {
    case PERSONS:
      count = db.delete("person", selection, selectionArgs);
      break;
    case PERSON:
      // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
      // 进行解析,返回值为10
      long personid = ContentUris.parseId(uri);
      String where = "id=" + personid;// 删除指定id的记录
      where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
      count = db.delete("person", where, selectionArgs);
      break;
    default:
      throw new IllegalArgumentException("Unknown URI " + uri);
    }
    db.close();
    return count;
  }
  @Override
  public int update(Uri uri, ContentValues values, String selection,
      String[] selectionArgs) {
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    int count = 0;
    switch (uriMatcher.match(uri)) {
    case PERSONS:
      count = db.update("person", values, selection, selectionArgs);
      break;
    case PERSON:
      // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
      // 进行解析,返回值为10
      long personid = ContentUris.parseId(uri);
      String where = "id=" + personid;// 获取指定id的记录
      where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
      count = db.update("person", values, where, selectionArgs);
      break;
    default:
      throw new IllegalArgumentException("Unknown URI " + uri);
    }
    db.close();
    return count;
  }
  @Override
  public String getType(Uri uri) {
    switch (uriMatcher.match(uri)) {
    case PERSONS:
      return PERSONS_TYPE;
    case PERSON:
      return PERSONS_ITEM_TYPE;
    default:
      throw new IllegalArgumentException("Unknown URI " + uri);
    }
  }
  @Override
  public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    switch (uriMatcher.match(uri)) {
    case PERSONS:
      return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
    case PERSON:
      // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
      // 进行解析,返回值为10
      long personid = ContentUris.parseId(uri);
      String where = "id=" + personid;// 获取指定id的记录
      where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
      return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
    default:
      throw new IllegalArgumentException("Unknown URI " + uri);
    }
  }
}

文件清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.ljq.sql" android:versionCode="1"
  android:versionName="1.0">
  <application android:icon="@drawable/icon"
    android:label="@string/app_name">
    <uses-library android:name="android.test.runner" />
    <activity android:name=".SqlActivity"
      android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category
          android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <provider android:name="com.ljq.db.PersonContentProvider"
       android:authorities="com.ljq.provider.personprovider" />
  </application>
  <uses-sdk android:minSdkVersion="7" />
  <instrumentation
    android:name="android.test.InstrumentationTestRunner"
    android:targetPackage="com.ljq.sql" android:label="Tests for My App" />
</manifest>

PersonContentProviderTest内容提供者测试类

《PHP技术内幕》中文版
《PHP技术内幕》中文版

本书详细说明了PHP的使用方法,内容涉及PHP应用的各个方面,并提供了大量的代码实例,使读者能够快速而容易地学会PHP。每一章都分为两部分,前一部分“深入分析”详细说明相关的技术信息,

下载
package com.ljq.test;
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 jiqinlin
 *
 */
public class PersonContentProviderTest extends AndroidTestCase{
  private static final String TAG = "PersonContentProviderTest";
  public void testSave() throws Throwable{
    ContentResolver contentResolver = this.getContext().getContentResolver();
    Uri insertUri = Uri.parse("content://com.ljq.provider.personprovider/person");
    ContentValues values = new ContentValues();
    values.put("name", "ljq");
    values.put("phone", "1350000009");
    Uri uri = contentResolver.insert(insertUri, values);
    Log.i(TAG, uri.toString());
  }
  public void testUpdate() throws Throwable{
    ContentResolver contentResolver = this.getContext().getContentResolver();
    Uri updateUri = Uri.parse("content://com.ljq.provider.personprovider/person/1");
    ContentValues values = new ContentValues();
    values.put("name", "linjiqin");
    contentResolver.update(updateUri, values, null, null);
  }
  public void testFind() throws Throwable{
    ContentResolver contentResolver = this.getContext().getContentResolver();
    //Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person");
    Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person");
    Cursor cursor = contentResolver.query(uri, null, null, null, "id asc");
    while(cursor.moveToNext()){
      int personid = cursor.getInt(cursor.getColumnIndex("id"));
      String name = cursor.getString(cursor.getColumnIndex("name"));
      String phone = cursor.getString(cursor.getColumnIndex("phone"));
      Log.i(TAG, "personid="+ personid + ",name="+ name+ ",phone="+ phone);
    }
    cursor.close();
  }
  public void testDelete() throws Throwable{
    ContentResolver contentResolver = this.getContext().getContentResolver();
    Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/1");
    contentResolver.delete(uri, null, null);
  }
}

希望本文所述对大家Android程序设计有所帮助。

更多Android内容提供者ContentProvider用法实例分析相关文章请关注PHP中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

2

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

0

2026.02.24

Go分布式服务治理与链路追踪实践
Go分布式服务治理与链路追踪实践

本专题围绕 Go 语言在分布式系统中的服务治理实践展开,系统讲解服务注册与发现、配置中心、限流熔断、灰度发布以及分布式链路追踪方案。通过完整项目示例,帮助开发者构建可观测性完善、稳定性高、易扩展的 Go 微服务架构体系,提升线上系统问题定位与运维效率。

0

2026.02.24

Python自动化测试与持续集成实战
Python自动化测试与持续集成实战

本专题聚焦 Python 在自动化测试与持续集成中的工程化实践,系统讲解测试框架选型、测试用例设计、接口自动化、测试数据管理及测试报告生成。结合 CI/CD 流水线场景,讲解如何将自动化测试融入持续集成流程,实现代码提交即自动测试,提升项目交付质量与团队协作效率。

0

2026.02.24

Java高并发系统设计与性能调优
Java高并发系统设计与性能调优

本专题围绕 Java 在高并发业务场景下的系统设计与性能调优展开,系统讲解线程模型、并发容器、锁机制、异步编程及 JVM 性能调优思路。结合真实高并发业务场景,深入分析接口限流、线程池配置、热点资源优化与系统稳定性保障方案,帮助开发者构建高性能、高可用的 Java 后端系统。

3

2026.02.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1250

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

402

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

252

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

39

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
550W粉丝大佬手把手从零学JavaScript
550W粉丝大佬手把手从零学JavaScript

共1课时 | 0.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号