`
chinrui
  • 浏览: 97598 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

初涉Android之ContentProvider

阅读更多

初涉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")));
		}
	}
}

 

 

分享到:
评论

相关推荐

    android 用ContentProvider操作文件

    1. ContentProvider概述:ContentProvider是Android四大组件之一,它的主要职责是管理应用内的数据并提供对外接口,让其他应用能够通过URI(统一资源标识符)来访问这些数据。这对于文件操作来说尤其有用,因为这样...

    Android+Room+ContentProvider

    Room是Google推出的Android架构组件之一,它提供了一个方便的SQL方言支持的抽象层,使得开发者可以更轻松地与SQLite数据库进行交互。Room的优点在于它减少了手动处理SQL语句的需求,同时提供了类型安全的查询和编译...

    Android 之 自定义ContentProvider的使用

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在...

    Android之ContentProvider事例

    在这个“Android之ContentProvider事例”中,我们将深入探讨ContentProvider的工作原理及其应用。 首先,ContentProvider的基本结构包括四个关键组件:`ContentContract`(内容契约类)、`ContentProvider`(内容...

    从头学Android之ContentProvider示例源代码

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享和访问的桥梁,使得不同应用程序之间可以安全地共享数据。本示例源代码旨在帮助初学者理解ContentProvider的工作原理及其使用方法。通过分析和...

    Android中ContentProvider的示例

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地交换数据。本示例将深入讲解如何创建和使用ContentProvider。 首先,我们来理解ContentProvider的基本概念...

    Android 之 ContentProvider手机簿使用

    这篇博客"Android之ContentProvider手机簿使用"主要探讨了如何通过ContentProvider来访问和操作手机联系人数据。 首先,理解ContentProvider的基本结构至关重要。一个ContentProvider由两部分组成:`...

    Android 基于ContentProvider 的音乐播放器

    Android基于ContentProvider的音乐播放器,通过读取系统多媒体信息,得到储存在外部存储器上的所有音频文件内容,用listview显示歌曲名和歌手信息.并通过mediaPlayer进行播放.该版本只是完成了一个音乐播放器的最简单...

    Android学习 ContentProvider数据更新与Observer模式.doc

    在Android开发中,ContentProvider和Observer模式是两个关键的概念,它们在数据管理和更新中起着重要作用。ContentProvider作为Android系统中数据共享的桥梁,允许不同的应用程序之间交换数据,而Observer模式则是一...

    Android ContentProvider全面解析

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构暴露给其他应用,同时也能够访问其他应用公开的数据。本篇文章将全面解析...

    Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作

    接下来,ContentProvider是Android四大组件之一,它提供了一种标准接口,使得其他应用程序可以访问和修改由ContentProvider管理的数据,无论这些数据是存储在SQLite数据库、文件系统还是网络中。要创建一个...

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    android 自定义 ContentProvider 以及 ContentResolver

    在Android开发中,ContentProvider和ContentResolver是两个关键组件,它们构成了Android系统中不同应用程序间数据共享的基础。本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作...

    Android 演示ContentProvider组件用法的写日记APP源码.rar

    本源码主要是演示Android ContentProvider组件的使用,借助一个写日记小程序来演示组件中各种方法的使用技巧,比如向日记本中插入一条数据,编辑当前数据内容、删除当前数据、查询cursor时候,感兴趣的那些条例如何...

    Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果,提供访问本地图片的工具类,有效避免OOM的出现,项目详情http://blog.csdn.net/xiaanming/article/details/18730223

    android开发contentprovider教学ppt(内部资料).pptx

    在Android开发中,ContentProvider是四大核心组件之一,它扮演着跨应用数据共享的角色。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,实现数据的透明访问。本篇内容将深入讲解ContentProvider的...

    Android ContentProvider简单实现

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和共享数据。本篇文章将详细介绍如何在Android中实现一个简单的ContentProvider。 首先,理解...

    android ContentProvider Demo

    ContentProvider作为Android四大组件之一,它的主要任务是封装和管理应用程序中的私有数据,使其他应用程序在遵循一定规则的情况下能够访问这些数据。 首先,我们要理解ContentProvider的工作原理。ContentProvider...

    android中contentprovider通讯录

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全、方便地访问和操作数据。本实例主要讲解如何在Android中利用ContentProvider实现通讯录功能,这对于理解...

Global site tag (gtag.js) - Google Analytics