`

android之ContentProvider

 
阅读更多

1:person类

package cn.itcast.domain;

public class Person {
	private Integer id;
	private String name;
	private Integer amount;
	
	public Integer getAmount() {
		return amount;
	}

	public void setAmount(Integer amount) {
		this.amount = amount;
	}

	public Person(){}
	
	public Person(Integer id, String name) {
		this.id = id;
		this.name = name;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [amount=" + amount + ", id=" + id + ", name=" + name
				+ "]";
	}


}

 

2:DBOpenHelper类

package cn.itcast.service;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {
	private static final String DATABASENAME = "itcast.db"; //数据库名称
	private static final int DATABASEVERSION = 2;//数据库版本

	public DBOpenHelper(Context context) {
		super(context, DATABASENAME, null, DATABASEVERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), amount integer)");//执行有更改的sql语句
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS person");
		onCreate(db);
	}

}

 

3:PersonProvider类

package cn.itcast.db;

import cn.itcast.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;
	private static final int PERSON = 2;
	static{
		MATCHER.addURI("cn.itcast.providers.personprovider", "person", PERSONS);
		MATCHER.addURI("cn.itcast.providers.personprovider", "person/#", PERSON);
	}	
	//删除person表中的所有记录   /person
	//删除person表中指定id的记录 /person/10
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		int count = 0;
		switch (MATCHER.match(uri)) {
		case PERSONS:
			count = db.delete("person", selection, selectionArgs);
			return count;
			
		case PERSON:
			long id = ContentUris.parseId(uri);
			String where = "personid="+ id;
			if(selection!=null && !"".equals(selection)){
				where = selection + " and " + where;
			}
			count = db.delete("person", where, selectionArgs);
			return count;
			
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	@Override
	public String getType(Uri uri) {//返回当前操作的数据的mimeType
		switch (MATCHER.match(uri)) {
		case PERSONS:			
			return "vnd.android.cursor.dir/person";
			
		case PERSON:			
			return "vnd.android.cursor.item/person";
			
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {// /person
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		switch (MATCHER.match(uri)) {
		case PERSONS:
			long rowid = db.insert("person", "name", values); 
			Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri
			this.getContext().getContentResolver().notifyChange(uri, null);
			return insertUri;

		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	@Override
	public boolean onCreate() {
		this.dbOpenHelper = new DBOpenHelper(this.getContext());
		return false;
	}
	//查询person表中的所有记录   /person
	//查询person表中指定id的记录 /person/10
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		switch (MATCHER.match(uri)) {
		case PERSONS:
			return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
			
		case PERSON:
			long id = ContentUris.parseId(uri);
			String where = "personid="+ id;
			if(selection!=null && !"".equals(selection)){
				where = selection + " and " + where;
			}
			return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
			
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}
	
	//更新person表中的所有记录   /person
	//更新person表中指定id的记录 /person/10
	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		int count = 0;
		switch (MATCHER.match(uri)) {
		case PERSONS:
			count = db.update("person", values, selection, selectionArgs);
			return count;
			
		case PERSON:
			long id = ContentUris.parseId(uri);
			String where = "personid="+ id;
			if(selection!=null && !"".equals(selection)){
				where = selection + " and " + where;
			}
			count = db.update("person", values, where, selectionArgs);
			return count;
			
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

}

 

4:AndroidManifest.xml

  <?xml version="1.0" encoding="utf-8" ?> 
- <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.db" 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=".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>
  <provider android:name=".PersonProvider" android:authorities="cn.itcast.providers.personprovider" /> 
  </application>
  <uses-sdk android:minSdkVersion="8" /> 
  <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.itcast.db" android:label="Tests for My App" /> 
  </manifest>

 

5:在另外一个应用程序中通过测试类:AccessContentProviderTest

package cn.itcast.other;

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 AccessContentProviderTest extends AndroidTestCase {
	private static final String TAG = "AccessContentProviderTest";
	
	/**
	 * 往内容提供者添加数据
	 * @throws Throwable
	 */
	public void testInsert() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri insertUri = Uri.parse("content://cn.itcast.providers.personprovider/person");
		ContentValues values = new ContentValues();
		values.put("name", "zhangxiaoxiao");
		values.put("amount", 90);
		Uri uri = contentResolver.insert(insertUri, values);
		Log.i(TAG, uri.toString());
	}

	/**
	 * 更新内容提供者中的数据
	 * @throws Throwable
	 */
	public void testUpdate() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri updateUri = Uri.parse("content://cn.itcast.providers.personprovider/person/1");
		ContentValues values = new ContentValues();
		values.put("name", "lili");
		contentResolver.update(updateUri, values, null, null);
	}
	
	/**
	 * 从内容提供者中删除数据
	 * @throws Throwable
	 */
	public void testDelete() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri deleteUri = Uri.parse("content://cn.itcast.providers.personprovider/person/1");
		contentResolver.delete(deleteUri, null, null);
	}
	
	/**
	 * 获取内容提供者中的数据
	 * @throws Throwable
	 */
	public void testFind() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri selectUri = Uri.parse("content://cn.itcast.providers.personprovider/person");
		Cursor cursor = contentResolver.query(selectUri, null, null, null, "personid desc");
		while(cursor.moveToNext()){
			int id = cursor.getInt(cursor.getColumnIndex("personid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			int amount = cursor.getInt(cursor.getColumnIndex("amount"));
			Log.i(TAG, "id="+ id + ",name="+ name+ ",amount="+ amount);
		}
	}
}

 6:在这里我还可以在另外一个应用程序中监听数据库手否发生变化,若发生在把数据库里面的数据在重新显示出来,在PersonProvider类里面有这样一句话:

this.getContext().getContentResolver().notifyChange(uri, null);

 

是当数据发生变化时,把信息发送出去:由另外一个应用程序:OtherActivity接受

package cn.itcast.other;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

public class OtherActivity extends Activity {
    private static final String TAG = "OtherActivity";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Uri insertUri = Uri.parse("content://cn.itcast.providers.personprovider/person");
        ContentResolver contentResolver = this.getContentResolver();
        //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
        contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler()));
    }
    
    private final class PersonObserver extends ContentObserver{
		public PersonObserver(Handler handler) {
			super(handler);
		}

		@Override
		public void onChange(boolean selfChange) {
			ContentResolver contentResolver = getContentResolver();
			Uri selectUri = Uri.parse("content://cn.itcast.providers.personprovider/person");
			Cursor cursor = contentResolver.query(selectUri, null, null, null, "personid desc");
			while(cursor.moveToNext()){
				int id = cursor.getInt(cursor.getColumnIndex("personid"));
				String name = cursor.getString(cursor.getColumnIndex("name"));
				int amount = cursor.getInt(cursor.getColumnIndex("amount"));
				Log.i(TAG, "id="+ id + ",name="+ name+ ",amount="+ amount);
			}
		}
    	
    }

}

 

分享到:
评论

相关推荐

    Android之ContentProvider事例

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以安全地分享内部数据,同时也为其他应用程序提供了一种标准接口来访问这些数据,无论是SQLite...

    Android 之 ContentProvider手机簿使用

    在Android系统中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和操作彼此的数据。这篇博客"Android之ContentProvider手机簿使用"主要探讨了如何通过...

    从头学Android之ContentProvider示例源代码

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

    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的基本概念...

    Android 基于ContentProvider 的音乐播放器

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

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

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

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

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

    Android ContentProvider全面解析

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

    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快速查找通讯录信息的代码清单.pdf

    在Android开发中,ContentProvider是实现应用程序间数据共享的关键组件。它遵循统一的接口标准,使得数据能够在不同的应用之间透明地访问。这篇资料主要讲解如何使用ContentProvider快速查找和访问设备上的通讯录...

    android自定义contentprovider

    ContentProvider构建于Android的URI机制之上,为其他应用提供了结构化的数据访问接口。本篇将详细讲解如何自定义ContentProvider,以及如何实现对联系人、彩信和通话记录的读取。 一、ContentProvider基础 1. **...

Global site tag (gtag.js) - Google Analytics