初涉Android之ContentProvider
一、ContentProvider的作用,可以让其它应用访问本应用的数据
第一步:定义ContentProvider如下:
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 helper = null; private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final int PERSONS = 1; private static final int PERSON = 2; static { MATCHER.addURI("cn.hpu.edu.personprovider", "person", PERSONS); MATCHER.addURI("cn.hpu.edu.personprovider", "person/#", PERSON); } /** * 删除数据库中相应的数据 */ public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = helper.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 = " id = " + rowid; if(selection != null && !"".equals(selection.trim())) { where += " and " + selection; } num = db.delete("person", where, selectionArgs); break; default : throw new IllegalArgumentException("this is An Unkown Uri : " + uri.toString()); } return num; } @Override public String getType(Uri uri) { return null; } /** * 向内容提供者里面插入数据 */ public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = helper.getWritableDatabase(); switch(MATCHER.match(uri)) { case PERSONS: long rowid = db.insert("person", "name", values); Uri insertUri = ContentUris.withAppendedId(uri, rowid); return insertUri; default: throw new IllegalArgumentException("this is An Unknown Uri:" + uri.toString()); } } /** * 该方法只调用一次用于初始化环境 */ public boolean onCreate() { helper = new DBOpenHelper(this.getContext()); return true; } /** * 按条件查询结果集并返回游标 */ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = helper.getReadableDatabase(); switch(MATCHER.match(uri)) { case PERSONS : return db.query("person", projection, selection, selectionArgs, null, null, sortOrder); case PERSON : long rawid = ContentUris.parseId(uri); String where = " id = " + rawid; if(selection != null && !"".equals(selection.trim())) { where += " and " + selection; } return db.query("person", projection, where, selectionArgs, null, null, sortOrder); default : throw new IllegalArgumentException("this is An Unknown Uri : " + uri.toString()); } } /** * 更新数据 */ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = helper.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 = " id = " + rowid; if(selection != null && !"".equals(selection.trim())) { where += " and " + selection; } num = db.update("person", values, where , selectionArgs); break; default : throw new IllegalArgumentException("this is An Unknown Uri : " + uri.toString()); } return num; } }
第二步:在本应用的AndroidManifest.xml里面声明Provider
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.hpu.edu" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <provider android:name=".util.PersonProvider" android:authorities="cn.hpu.edu.personprovider"></provider> <activity android:name="cn.hpu.edu.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="android.test.runner"/> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.hpu" android:label="Tests for PersonService"></instrumentation> </manifest>
第三步:在另外一个应用里面添加如下测试:
import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.AndroidTestCase; import android.util.Log; public class TestAccessContentProvider extends AndroidTestCase { private static final String TAG = "TestAccessContentProvider"; private static final String URI = "content://cn.hpu.edu.personprovider/person"; public void testInsert() throws Exception { Uri uri = Uri.parse(URI); ContentResolver resolver = this.getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("id", 45); values.put("name", "qiernsdf"); values.put("phone", "123456789"); resolver.insert(uri, values); } public void testDelete() throws Exception { Uri uri = Uri.parse(URI + "/10"); ContentResolver resolver = this.getContext().getContentResolver(); resolver.delete(uri, null, null); } public void testUpdate() throws Exception { Uri uri = Uri.parse(URI + "/11"); ContentResolver resolver = this.getContext().getContentResolver(); ContentValues values = new ContentValues(); values.put("name" , "updateValues"); resolver.update(uri, values, null, null); } public void testFind() throws Exception { Uri uri = Uri.parse(URI); ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, null, null, null, " id asc"); while(cursor.moveToNext()) { Log.i(TAG ,cursor.getString(cursor.getColumnIndex("name"))); } } }
相关推荐
1. ContentProvider概述:ContentProvider是Android四大组件之一,它的主要职责是管理应用内的数据并提供对外接口,让其他应用能够通过URI(统一资源标识符)来访问这些数据。这对于文件操作来说尤其有用,因为这样...
Room是Google推出的Android架构组件之一,它提供了一个方便的SQL方言支持的抽象层,使得开发者可以更轻松地与SQLite数据库进行交互。Room的优点在于它减少了手动处理SQL语句的需求,同时提供了类型安全的查询和编译...
在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在...
在这个“Android之ContentProvider事例”中,我们将深入探讨ContentProvider的工作原理及其应用。 首先,ContentProvider的基本结构包括四个关键组件:`ContentContract`(内容契约类)、`ContentProvider`(内容...
在Android开发中,ContentProvider是四大组件之一,它充当了数据共享和访问的桥梁,使得不同应用程序之间可以安全地共享数据。本示例源代码旨在帮助初学者理解ContentProvider的工作原理及其使用方法。通过分析和...
在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地交换数据。本示例将深入讲解如何创建和使用ContentProvider。 首先,我们来理解ContentProvider的基本概念...
这篇博客"Android之ContentProvider手机簿使用"主要探讨了如何通过ContentProvider来访问和操作手机联系人数据。 首先,理解ContentProvider的基本结构至关重要。一个ContentProvider由两部分组成:`...
Android基于ContentProvider的音乐播放器,通过读取系统多媒体信息,得到储存在外部存储器上的所有音频文件内容,用listview显示歌曲名和歌手信息.并通过mediaPlayer进行播放.该版本只是完成了一个音乐播放器的最简单...
在Android开发中,ContentProvider和Observer模式是两个关键的概念,它们在数据管理和更新中起着重要作用。ContentProvider作为Android系统中数据共享的桥梁,允许不同的应用程序之间交换数据,而Observer模式则是一...
在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构暴露给其他应用,同时也能够访问其他应用公开的数据。本篇文章将全面解析...
接下来,ContentProvider是Android四大组件之一,它提供了一种标准接口,使得其他应用程序可以访问和修改由ContentProvider管理的数据,无论这些数据是存储在SQLite数据库、文件系统还是网络中。要创建一个...
Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...
在Android开发中,ContentProvider和ContentResolver是两个关键组件,它们构成了Android系统中不同应用程序间数据共享的基础。本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作...
本源码主要是演示Android ContentProvider组件的使用,借助一个写日记小程序来演示组件中各种方法的使用技巧,比如向日记本中插入一条数据,编辑当前数据内容、删除当前数据、查询cursor时候,感兴趣的那些条例如何...
Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果,提供访问本地图片的工具类,有效避免OOM的出现,项目详情http://blog.csdn.net/xiaanming/article/details/18730223
在Android开发中,ContentProvider是四大核心组件之一,它扮演着跨应用数据共享的角色。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,实现数据的透明访问。本篇内容将深入讲解ContentProvider的...
在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和共享数据。本篇文章将详细介绍如何在Android中实现一个简单的ContentProvider。 首先,理解...
ContentProvider作为Android四大组件之一,它的主要任务是封装和管理应用程序中的私有数据,使其他应用程序在遵循一定规则的情况下能够访问这些数据。 首先,我们要理解ContentProvider的工作原理。ContentProvider...
在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全、方便地访问和操作数据。本实例主要讲解如何在Android中利用ContentProvider实现通讯录功能,这对于理解...