当前位置: 代码迷 >> Android >> Android纳闷之使用ContentProvider实现数据共享
  详细解决方案

Android纳闷之使用ContentProvider实现数据共享

热度:96   发布时间:2016-05-01 17:44:04.0
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);	}}


 

 

 

 

  相关解决方案