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

来源:互联网 发布:淘宝一键抢拍 编辑:程序博客网 时间:2024/06/15 05:11

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的Authoritypublic 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提供服务的两个Uripublic 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);}@Overridepublic void onCreate(SQLiteDatabase db){// 第一个使用数据库时自动建表db.execSQL(CREATE_TABLE_SQL);}@Overridepublic 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注册两个Urimatcher.addURI(Words.AUTHORITY, "words", WORDS);matcher.addURI(Words.AUTHORITY, "word/#", WORD);}// 第一次调用该DictProvider时,系统先创建DictProvider对象,并回调该方法@Overridepublic boolean onCreate(){dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", 1);return true;}// 插入数据方法@Overridepublic Uri insert(Uri uri, ContentValues values){// 获得数据库实例SQLiteDatabase db = dbOpenHelper.getReadableDatabase();// 插入数据,返回行IDlong rowId = db.insert("dict", Words.Word._ID, values);// 如果插入成功返回uriif (rowId > 0){// 在已有的 Uri的后面追加ID数据Uri wordUri = ContentUris.withAppendedId(uri, rowId);// 通知数据已经改变getContext().getContentResolver().notifyChange(wordUri, null);return wordUri;}return null;}// 删除数据的方法@Overridepublic 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:// 解析出所需要删除的记录IDlong 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;}// 修改数据的方法@Overridepublic 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:// 解析出想修改的记录IDlong 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;}// 查询数据的方法@Overridepublic 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:// 解析出想查询的记录IDlong 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类型@Overridepublic 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;@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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));//创建一个IntentIntent intent = new Intent(DictResolver.this, ResultActivity.class);intent.putExtras(data);//启动ActivitystartActivity(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{@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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封装成SimpleAdapterSimpleAdapter adapter = new SimpleAdapter(ResultActivity.this, list, R.layout.line, new String[]{"word", "detail"}, new int[]{R.id.word, R.id.detail});//填充ListViewlistView.setAdapter(adapter);}}