`

使用contentprovider共享生词本数据

阅读更多
摘自李刚<疯狂android>备份学习使用

首先我们为该contentprovider定义一个工具类,该类中只是包含一个public static的常量,该工具类的代码如下:
import android.net.Uri;
import android.provider.BaseColumns;

public final class Words {
	
	//定义该contentprovider的authority
	public static final String AUTHORITY = "org.crazyit.providers.dictprovider";
	
	//定义一个静态内部类
	public static final class Word implements BaseColumns{
		
		//定义content所允许操作的三个数据列
		public static final String _ID = "_id";
		public static final String WORD = "word";
		public static final String DETAIL = "detail";
		
		//定义该content提供服务的两个Uri
		public static final Uri DICT_CONTETN_URI =
			Uri.parse("content://" + AUTHORITY + "/words");
		public static final Uri WORD_CONTENT_URI = 
			Uri.parse("content://" + AUTHORITY + "/word");
	}
}


上面的工具类只是定义了一些简单的工具类,这个工具类的作用就是告诉其他应用程序,访问该contentprovider的一些常用入口。

数据库创建MyDatabaseHelper代码:

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

public class MyDatabaseHelper extends SQLiteOpenHelper{

	private final String CREATE_TABLE_SQL= 
		"create table dict(_id integer primary key autoincrement, word , detail)";
	
	public MyDatabaseHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_TABLE_SQL);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("--------onUpdate Called--------"
				+ oldVersion + "----->" + newVersion);
	}

}



接下来我们开发一个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;

import com.dictprovider.content.Words;
import com.mydatabasehelper.database.MyDatabaseHelper;

public class DictProvider extends ContentProvider{

	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int WORDS = 1;
	private static final int WORD = 2;
	private MyDatabaseHelper dbOpenHelper;
	
	static{
		matcher.addURI(Words.AUTHORITY, "words", WORDS);
		matcher.addURI(Words.AUTHORITY, "word/#", WORD);
	}
	
	//第一次调用该DictProvider时,系统先创建DictProvider对象,并回调该方法
	@Override
	public boolean onCreate() {
		dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", null, 1);
		return true;
	}
	
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		//获得数据库实例
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		long rowId = db.insert("dict", Words.Word._ID, values);
		//如果插入成功则返回uri
		if(rowId > 0){
			//在已有的Uri的后面追加ID数据
			Uri wordUri = ContentUris.withAppendedId(uri, rowId);
			//通知数据已经改变
			getContext().getContentResolver().notifyChange(wordUri, null);
			return wordUri;
		}
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		//记录所删除的记录数
		int num = 0;
		//对uri进行匹配
		switch(matcher.match(uri)){
		case WORDS:{
			num = db.delete("dict", selection, selectionArgs);
			break;
		}
		case WORD:{
			long id = ContentUris.parseId(uri);
			String where = Words.Word._ID + "=" + id;
			//如果原来的where子句存在,拼接where子句
			if(selection != null && !selection.equals("")){
				where = where + " and " + selection;
			}
			num = db.delete("dict", where, selectionArgs);
			break;
		}
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return num;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		int num = 0;
		switch(matcher.match(uri)){
		case WORDS:{
			num = db.update("dict", values, selection, selectionArgs);
			break;
		}
		case WORD:{
			long id = ContentUris.parseId(uri);
			String where = Words.Word._ID + "=" + id;
			if(selection != null && !"".equals(selection)){
				where = where + " and " + selection;
			}
			num = db.update("dict", values, where, selectionArgs);
			break;
		}
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return num;
	}

	
	@Override
	public String getType(Uri uri) {
		switch(matcher.match(uri)){
		case WORDS:{
			return "vnd.android.cursor.dir/org.crazyit.dict";
		}
		case WORD:{
			return "vnd.android.cursor.item/org.crazyit.dict";
		}
		}
		return null;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		switch(matcher.match(uri)){
		case WORDS:{
			return db.query("dict", projection, selection, selectionArgs, null, null, sortOrder);
		}
		case WORD:{
			long id = ContentUris.parseId(uri);
			String where = Words.Word._ID + "=" + id;
			if(selection != null && !selection.equals("")){
				where = where + " and " + selection;
			}
			return db.query("dict", projection, selection, selectionArgs, null, null, sortOrder);
		}
		}
		return null;
	}
}



上面的dictProvider类很简单,它除了继承系统的contentprovider之外,还实现了操作数据的增、删、改、查等方法,那木该contentprovider就开发完成了。

接下来需要在androidmanifest.xml文件中注册该contentprovider,这就需要在androidmanifest.xml文件中增加如下配置片段:
<provider android:name="com.dictprovider.provider.DictProvider"
            android:authorities="org.crazyit.providers.dictprovider"/>


至此,暴露生词本数据的contentprovider开发完成。为了测试该contentprovider的开发是否成功,接下来再开发一个应用程序,该应用程序将会通过contentresolver来操作生词本中的数据。
该程序同样提供了添加生词、查询生词的功能,只是改程序并不保存数据,而是访问前面dictProvider所共享的数据,下面是contentresolver的类的代码。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.dictprovider.content.Words;
import com.dictprovider.observer.WordObserver;

public class MainActivity extends Activity {

	ContentResolver contentResolver;
	Button insert = null;
	Button search = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//获取系统contentresolver对象
		contentResolver = getContentResolver();
		getContentResolver().registerContentObserver(Uri.parse("content://" + Words.AUTHORITY), true, new WordObserver(this,new Handler()));
		
		
		insert = (Button)findViewById(R.id.insert);
		search = (Button)findViewById(R.id.search);
		
		insert.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String word = ((EditText)findViewById(R.id.word)).getText().toString();
				String detail = ((EditText)findViewById(R.id.detail)).getText().toString();
				
				//插入生词记录
				ContentValues values = new ContentValues();
				values.put(Words.Word.WORD, word);
				values.put(Words.Word.DETAIL, detail);
				contentResolver.insert(Words.Word.DICT_CONTETN_URI, values);
				Toast.makeText(MainActivity.this, "insert success", Toast.LENGTH_SHORT).show();
			}
		});
		
		search.setOnClickListener(new OnClickListener() {
			
			//获取用户输入
			@Override
			public void onClick(View v) {
				String key = ((EditText)findViewById(R.id.key)).getText().toString();
			
			//执行查询
			Cursor cursor = contentResolver.query(
					Words.Word.DICT_CONTETN_URI, null, 
					"word like ? or detail like ?", 
					new String[]{"%" + key + "%", "%" + key + "%"}, 
					null);
			
			//创建一个bundle对象
			Bundle data = new Bundle();
			data.putSerializable("data", converCursorToList(cursor));
			
			Intent intent = new Intent(MainActivity.this, ResultActivity.class);
			intent.putExtras(data);
			startActivity(intent);
			}
		});
	}
	
	private ArrayList<Map<String, String>> converCursorToList(Cursor cursor){
		ArrayList<Map<String, String>> result = new ArrayList<Map<String,String>>();
		while(cursor.moveToNext()){
			Map<String, String> map = new HashMap<String, String>();
			map.put(Words.Word.WORD, cursor.getString(1));
			map.put(Words.Word.DETAIL, cursor.getString(2));
			result.add(map);
		}
		return result;
	}
}



工程代码见附件
分享到:
评论

相关推荐

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

    将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交作业应列出操作数据的Uri及数据表的字段名称; (3) ...

    使用ContentProvider共享数据

    "使用ContentProvider共享数据"这个主题涉及到如何构建和使用ContentProvider来开放数据库,以及如何通过ContentResolver来执行对这些共享数据的操作。 首先,理解ContentProvider的结构至关重要。ContentProvider...

    实验8 contentProvider共享数据1

    `ContentProvider`是Android系统中用于不同应用程序间共享数据的一种核心组件。在本实验中,我们将学习如何创建和使用`ContentProvider`,以及如何通过`ContentResolver`和`ContentObserver`来与`ContentProvider`...

    ContentProvider共享数据使用案例

    该文件中有两个应用,db应用通过ContentProvider对外提供数据共享,other应用提供测试代码对数据进行增删改查。 参考博客:http://blog.csdn.net/tan313/article/details/44338425

    疯狂android资料:第九章使用ContentProvider实现数据共享.doc

    * 数据共享:ContentProvider 允许不同的应用程序之间共享数据,从而实现数据的共享和重用。 * 数据安全:ContentProvider 可以对数据进行保护,以免其他应用程序未经授权地访问数据。 * 灵活性:ContentProvider ...

    ContentProvider共享数据的使用

    本教程将深入探讨如何使用ContentProvider来实现数据共享。 ### 一、ContentProvider基本概念 1. **组件角色**:ContentProvider作为Android四大组件之一,主要负责数据的读写操作,提供统一的接口供其他应用调用...

    ContentProvider数据共享

    下面将详细介绍ContentProvider数据共享的基本使用方法。 1. 创建ContentProvider 要创建一个ContentProvider,你需要继承`android.content.ContentProvider`类,并重写其中的关键方法,如`onCreate()`, `query()`,...

    采用ContentProvider对外共享数据

    本篇将深入探讨如何使用ContentProvider对外共享数据以及如何监听内容提供者中的数据变化。 一、ContentProvider基础 ContentProvider是Android四大组件之一,它负责管理应用程序的数据,并提供统一的接口供其他...

    android 数据共享(ContentProvider)

    ContentProvider提供了一种标准化的机制,使得不同的应用程序可以安全、有序地访问和共享数据,无论这些数据是存储在SQLite数据库、文件系统还是其他持久化存储中。下面我们将深入探讨ContentProvider的工作原理及其...

    ContentProvider实现数据共享

    本教程将深入探讨如何利用ContentProvider实现数据共享。 一、ContentProvider基础 1. **定义与作用**:ContentProvider是一个接口,应用程序通过实现这个接口来提供对外的数据服务。它封装了数据访问逻辑,使得...

    ContentProvider 共享SharedPreferences 值

    `ContentProvider` 是Android提供的一种机制,允许应用间安全地共享数据。本篇将详细讲解如何利用`ContentProvider`来共享`SharedPreferences`的值。 首先,理解`SharedPreferences`。它是Android系统提供的一种轻...

    ContentProvider如何共享数据

    #### 使用 ContentProvider 共享数据的基本步骤 1. **创建 ContentProvider 类**:首先,需要创建一个继承自 `ContentProvider` 的类,并实现其中的方法。 2. **配置 ContentProvider**:在 `AndroidManifest.xml` ...

    博客&lt;ContentProvider数据库共享之 实例讲解&gt;对应源码

    通过深入理解ContentProvider的工作原理和实际操作,开发者可以更好地在不同应用之间共享数据,提高应用间的协同能力。 ContentProvider是Android系统提供的一种标准接口,允许应用程序之间安全地共享数据。它为...

    第8章 跨程序共享数据,探究ContentProvider.pptx

    ContentProvider 是 Android 实现跨程序共享数据的标准方式,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。本文将详细介绍 ContentProvider 的主要功能、运行时...

    使用ContentProvider在应用间传递数据

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据。ContentProvider构建在SQLite数据库之上,提供了标准的接口,使得一个应用的数据可以被其他应用访问和操作。本篇文章将详细阐述如何...

    ContentProvider自定义以及使用系统ContentProvider

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据...在实际开发中,掌握ContentProvider的使用能让你更好地管理和共享应用数据,提升用户体验。

Global site tag (gtag.js) - Google Analytics