Android疑惑之使用ContentProvider实现数据共享

Anroid疑惑之使用ContentProvider实现数据共享

ContentProvider是我学习安卓这几个月以来碰到最难理解的一块,感觉很难掌握,不知道如何使用这一块内容,有些方法的参数使用起来真的是令人发指,我也不打算一下子把全部内容都运用自如,那是不可能的事情,下面是学习ContentProvider所实现的一个实例:

实例:使用ContentProvider共享生词本数据

这个实例可以简单实现添加生词和查询生词的功能,我原本想扩展一下这个应用程序的功能,但却不知道从何做起,只是简简单单换了了界面背景就是了。

创建项目:DictProvider

项目运行效果:

    

 

下面只给出主要代码布局文件和string资源文件均不给出

运行以上项目需要在Menifest文件注册相关信息,和设置相关权限

   
     <activity android:name=".ResultActivity" 
			android:theme="@android:style/Theme.Dialog"
			android:label="找到的单词">
            </activity>
        <provider android:name=".DictProvider"
            android:authorities="org.crazyit.providers.dictprovider"/>


 

定义的工具类:Words.java

package wwj.dictprovider;

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所允许操作的3个数据列
		public final static String _ID = "_id";
		public final static String WORD = "word";
		public final static String DETAIL = "detail";
		// 定义该Content提供服务的两个Uri
		public final static Uri DICT_CONTENT_URI = 
			Uri.parse("content://" +  AUTHORITY + "/words");
		public final static Uri WORD_CONTENT_URI = 
			Uri.parse("content://" +  AUTHORITY + "/word");		
	}
}


 

因为要用到SQLite数据库,所以需要继承SQLiteOpenHelper类

==>MyDatabaseHelper.java

package wwj.dictprovider;

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

public class MyDatabaseHelper extends SQLiteOpenHelper
{
	final String CREATE_TABLE_SQL =
		"create table dict(_id integer primary key autoincrement , word , detail)";
	/**
	 * @param context
	 * @param name
	 * @param version
	 */
	public MyDatabaseHelper(Context context, String name, int version)
	{
		super(context, name, null, 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类:DictProvider.java

 

package wwj.dictprovider;

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 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
	{
		// 为UriMatcher注册两个Uri
		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", 1);
		return true;
	}
	// 插入数据方法
	@Override
	public Uri insert(Uri uri, ContentValues values)
	{
		// 获得数据库实例
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// 插入数据,返回行ID
		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:
				// 解析出所需要删除的记录ID
				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;
			default:
				throw new IllegalArgumentException("未知Uri:" + uri);
		}
		// 通知数据已经改变
		getContext().getContentResolver().notifyChange(uri, null);
		return num;
	}
	// 修改数据的方法
	@Override
	public int update(Uri uri, ContentValues values, String selection,
		String[] selectionArgs)
	{
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// 记录所修改的记录数
		int num = 0;
		switch (matcher.match(uri))
		{
			case WORDS:
				num = db.update("dict", values, selection, selectionArgs);
				break;
			case WORD:
				// 解析出想修改的记录ID
				long id = ContentUris.parseId(uri);
				String where = Words.Word._ID + "=" + id;
				// 如果原来的where子句存在,拼接where子句
				if (selection != null && !selection.equals(""))
				{
					where = where + " and " + selection;
				}
				num = db.update("dict", values, where, selectionArgs);
				break;
			default:
				throw new IllegalArgumentException("未知Uri:" + uri);
		}
		// 通知数据已经改变
		getContext().getContentResolver().notifyChange(uri, null);
		return num;
	}
	// 查询数据的方法
	@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:
				// 解析出想查询的记录ID
				long id = ContentUris.parseId(uri);
				String where = Words.Word._ID + "=" + id;
				// 如果原来的where子句存在,拼接where子句
				if (selection != null && !"".equals(selection))
				{
					where = where + " and " + selection;
				}
				return db.query("dict", projection, where, selectionArgs, null,
					null, sortOrder);
			default:
				throw new IllegalArgumentException("未知Uri:" + uri);
		}
	}
	// 返回指定uri参数对应的数据的MIME类型
	@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";
			default:
				throw new IllegalArgumentException("未知Uri:" + uri);
		}
	}
}


 

主Activity文件:DictResolver.java

package wwj.dictprovider;

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.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class DictResolver extends Activity
{
	ContentResolver contentResolver;
	Button insert = null;
	Button search = null;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 获取系统的ContentResolver对象
		contentResolver = getContentResolver();
		insert = (Button)findViewById(R.id.insert);
		search = (Button)findViewById(R.id.search);	
		// 为insert按钮的单击事件绑定事件监听器
		insert.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View source)
			{
				//获取用户输入
				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_CONTENT_URI, values);
				//显示提示信息
				Toast.makeText(DictResolver.this, "添加生词成功!" , 8000)
					.show();
			}			
		});
		// 为search按钮的单击事件绑定事件监听器
		search.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View source)
			{
				// 获取用户输入
				String key = ((EditText) findViewById(R.id.key)).getText()
					.toString();
				// 执行查询
				Cursor cursor = contentResolver.query(
					Words.Word.DICT_CONTENT_URI, null 
					, "word like ? or detail like ?"
					, new String[]{"%" + key + "%" , "%" + key + "%"} 
					, null);
				//创建一个Bundle对象
				Bundle data = new Bundle();
				data.putSerializable("data", converCursorToList(cursor));
				//创建一个Intent
				Intent intent = new Intent(DictResolver.this
					, ResultActivity.class);
				intent.putExtras(data);
				//启动Activity
				startActivity(intent);
			}
		});
	}

	private ArrayList<Map<String, String>> converCursorToList(
		Cursor cursor)
	{
		ArrayList<Map<String, String>> result 
			= new ArrayList<Map<String, String>>();
		// 遍历Cursor结果集
		while (cursor.moveToNext())
		{
			// 将结果集中的数据存入ArrayList中
			Map<String, String> map = new HashMap<String, String>();
			// 取出查询记录中第2列、第3列的值
			map.put(Words.Word.WORD, cursor.getString(1));
			map.put(Words.Word.DETAIL, cursor.getString(2));
			result.add(map);
		}
		return result;
	}
}


ResultActivity.java

package wwj.dictprovider;

import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class ResultActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.popup);
		ListView listView = (ListView)findViewById(R.id.show);
		Intent intent = getIntent();
		//获取该intent所携带的数据
		Bundle data = intent.getExtras();
		//从Bundle数据包中取出数据
		@SuppressWarnings("unchecked")
		List<Map<String, String>> list =
			 (List<Map<String, String>>)data.getSerializable("data");
		//将List封装成SimpleAdapter
		SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this, list, R.layout.line
				, new String[]{"word", "detail"}
				, new int[]{R.id.word, R.id.detail});
		//填充ListView
		listView.setAdapter(adapter);
	}
}


 

 

 

 

posted on 2012-07-28 21:27  1.曲待续  阅读(341)  评论(1编辑  收藏  举报

导航