Android开发入门之采用ContentProvider对外共享数据

2024-06-03 05:38

本文主要是介绍Android开发入门之采用ContentProvider对外共享数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在cn.leigo,db下新建PersonProvider类,该类集成ContentProvider:

package cn.leigo.db;import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;public class PersonProvider extends ContentProvider {@Overridepublic boolean onCreate() {// TODO Auto-generated method stubreturn false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubreturn null;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubreturn null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}

并在AndroidManifest,xml文件中进行配置

 <provider android:name="cn.leigo.db.PersonProvider" android:authorities="cn.leigo.providers.personprovider"/>

对外提供查询方法:

package cn.leigo.db;import cn.leigo.service.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;public class PersonProvider extends ContentProvider {private DBOpenHelper dbOpenHelper;private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);private static final int PERSONS = 1;static {MATCHER.addURI("cn.leigo.providers.personprovider", "person", PERSONS);}@Overridepublic boolean onCreate() {dbOpenHelper = new DBOpenHelper(getContext());return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {return null;}@Overridepublic String getType(Uri uri) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbOpenHelper.getWritableDatabase();switch (MATCHER.match(uri)) {case PERSONS:long rowid = db.insert("person", "name", values); // 主键值// content://cn.leigo.providers.personprovider/person/10// Uri insertUri =// Uri.parse("content://cn.leigo.providers.personprovider/person/"+// rowid);Uri insertUri = ContentUris.withAppendedId(uri, rowid);return insertUri;default:throw new IllegalArgumentException("this is Unknow Uri:" + uri);}}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {return 0;}}

然后进行测试,新建一个测试项目other,所要测试的工程为db

package cn.leigo.db.test;import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.test.AndroidTestCase;public class AccessContentProviderTest extends AndroidTestCase {public void testInsert() throws Exception {Uri uri = Uri.parse("content://cn.leigo.providers.personprovider/person");ContentResolver resolver = getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "zhaoliu");values.put("phone", "18832358032");values.put("amount", 10000);resolver.insert(uri, values);}
}

可以看到数据已经插入进去了。


对外提供删除方法:

    private static final int PERSON = 2;static {MATCHER.addURI("cn.leigo.providers.personprovider", "person", PERSONS);MATCHER.addURI("cn.leigo.providers.personprovider", "person/#", PERSON);}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = dbOpenHelper.getWritableDatabase();int num = 0;switch (MATCHER.match(uri)) {case PERSONS:num = db.delete("person", selection, selectionArgs);break;case PERSON:long rowid = ContentUris.parseId(uri);String where = "personid=" + rowid;if (!TextUtils.isEmpty(selection)) {where += " and " + selection;}num = db.delete("person", where, selectionArgs);break;default:throw new IllegalArgumentException("this is Unknow Uri:" + uri);}return num;}

 测试类: 

    public void testDelete() throws Exception {Uri uri = Uri.parse("content://cn.leigo.providers.personprovider/person/20");ContentResolver resolver = getContext().getContentResolver();resolver.delete(uri, null, null);}

运行后:

id为20的数据已删除。


对外提供更新方法:

        @Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db = dbOpenHelper.getWritableDatabase();int num = 0;switch (MATCHER.match(uri)) {case PERSONS:num = db.update("person", values, selection, selectionArgs);break;case PERSON:long rowid = ContentUris.parseId(uri);String where = "personid=" + rowid;if (!TextUtils.isEmpty(selection)) {where += " and " + selection;}num = db.update("person", values, where, selectionArgs);break;default:throw new IllegalArgumentException("this is Unknow Uri:" + uri);}return num;}

测试类:

    public void testUpdate() throws Exception {Uri uri = Uri.parse("content://cn.leigo.providers.personprovider/person/19");ContentResolver resolver = getContext().getContentResolver();ContentValues values = new ContentValues();values.put("name", "wangwu");resolver.update(uri, values, null, null);}

运行后:

id为19的Person name已改为wangwu



对外提供查询方法:

	@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor = null;SQLiteDatabase db = dbOpenHelper.getReadableDatabase();switch (MATCHER.match(uri)) {case PERSONS:cursor = db.query("person", null, selection, selectionArgs, null,null, sortOrder);break;case PERSON:long rowid = ContentUris.parseId(uri);String where = "personid=" + rowid;if (!TextUtils.isEmpty(selection)) {where += " and " + selection;}cursor = db.query("person", projection, where, selectionArgs,null, null, sortOrder);break;default:throw new IllegalArgumentException("this is Unknow Uri:" + uri);}return cursor;}


测试类:

	public void testQuery() throws Exception {Uri uri = Uri.parse("content://cn.leigo.providers.personprovider/person");ContentResolver resolver = getContext().getContentResolver();Cursor cursor = resolver.query(uri, null, null, null, null);while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndex("name"));Log.i(TAG, name);}cursor.close();}


	@Overridepublic String getType(Uri uri) {String type = "";switch (MATCHER.match(uri)) {case PERSONS:type = "vnd.android.cursor.dir/person";break;case PERSON:type = "vnd.android.cursor.item/person";break;default:throw new IllegalArgumentException("this is Unknow Uri:" + uri);}return type;}


这篇关于Android开发入门之采用ContentProvider对外共享数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026135

相关文章

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大