ContentProvider是我学习安卓这几个月以来碰到最难理解的一块,感觉很难掌握,不知道如何使用这一块内容,有些方法的参数使用起来真的是令人发指,我也不打算一下子把全部内容都运用自如,那是不可能的事情,下面是学习ContentProvider所实现的一个实例:
实例:使用ContentProvider共享生词本数据
这个实例可以简单实现添加生词和查询生词的功能,我原本想扩展一下这个应用程序的功能,但却不知道从何做起,只是简简单单换了了界面背景就是了。
创建项目:DictProvider
项目运行效果:
下面只给出主要代码布局文件和string资源文件均不给出
运行以上项目需要在Menifest文件注册相关信息,和设置相关权限
android:theme="@android:style/Theme.Dialog"
android:label="找到的单词">
android:authorities="org.crazyit.providers.dictprovider"/>
定义的工具类:Words.java
packagewwj.dictprovider;
importandroid.net.Uri;
importandroid.provider.BaseColumns;
publicfinalclassWords
{
// 定义该ContentProvider的Authority
publicstaticfinalString AUTHORITY
="org.crazyit.providers.dictprovider";
//定义一个静态内部类
publicstaticfinalclassWordimplementsBaseColumns
{
// 定义Content所允许操作的3个数据列
publicfinalstaticString _ID ="_id";
publicfinalstaticString WORD ="word";
publicfinalstaticString DETAIL ="detail";
// 定义该Content提供服务的两个Uri
publicfinalstaticUri DICT_CONTENT_URI =
Uri.parse("content://"+ AUTHORITY +"/words");
publicfinalstaticUri WORD_CONTENT_URI =
Uri.parse("content://"+ AUTHORITY +"/word");
}
}
因为要用到SQLite数据库,所以需要继承SQLiteOpenHelper类
==>MyDatabaseHelper.java
packagewwj.dictprovider;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
publicclassMyDatabaseHelperextendsSQLiteOpenHelper
{
finalString CREATE_TABLE_SQL =
"create table dict(_id integer primary key autoincrement , word , detail)";
/**
* @param context
* @param name
* @param version
*/
publicMyDatabaseHelper(Context context, String name,intversion)
{
super(context, name,null, version);
}
@Override
publicvoidonCreate(SQLiteDatabase db)
{
// 第一个使用数据库时自动建表
db.execSQL(CREATE_TABLE_SQL);
}
@Override
publicvoidonUpgrade(SQLiteDatabase db,intoldVersion,intnewVersion)
{
System.out.println("--------onUpdate Called--------"
+ oldVersion +"--->"+ newVersion);
}
}
实现ContentProvider类:DictProvider.java
packagewwj.dictprovider;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.UriMatcher;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.net.Uri;
publicclassDictProviderextendsContentProvider
{
privatestaticUriMatcher matcher
=newUriMatcher(UriMatcher.NO_MATCH);
privatestaticfinalintWORDS =1;
privatestaticfinalintWORD =2;
privateMyDatabaseHelper dbOpenHelper;
static
{
// 为UriMatcher注册两个Uri
matcher.addURI(Words.AUTHORITY,"words", WORDS);
matcher.addURI(Words.AUTHORITY,"word/#", WORD);
}
// 第一次调用该DictProvider时,系统先创建DictProvider对象,并回调该方法
@Override
publicbooleanonCreate()
{
dbOpenHelper =newMyDatabaseHelper(this.getContext(),"myDict.db3",1);
returntrue;
}
// 插入数据方法
@Override
publicUri insert(Uri uri, ContentValues values)
{
// 获得数据库实例
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
// 插入数据,返回行ID
longrowId = db.insert("dict", Words.Word._ID, values);
// 如果插入成功返回uri
if(rowId >0)
{
// 在已有的 Uri的后面追加ID数据
Uri wordUri = ContentUris.withAppendedId(uri, rowId);
// 通知数据已经改变
getContext().getContentResolver().notifyChange(wordUri,null);
returnwordUri;
}
returnnull;
}
// 删除数据的方法
@Override
publicintdelete(Uri uri, String selection, String[] selectionArgs)
{
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
// 记录所删除的记录数
intnum =0;
// 对于uri进行匹配。
switch(matcher.match(uri))
{
caseWORDS:
num = db.delete("dict", selection, selectionArgs);
break;
caseWORD:
// 解析出所需要删除的记录ID
longid = 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:
thrownewIllegalArgumentException("未知Uri:"+ uri);
}
// 通知数据已经改变
getContext().getContentResolver().notifyChange(uri,null);
returnnum;
}
// 修改数据的方法
@Override
publicintupdate(Uri uri, ContentValues values, String selection,
String[] selectionArgs)
{
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
// 记录所修改的记录数
intnum =0;
switch(matcher.match(uri))
{
caseWORDS:
num = db.update("dict", values, selection, selectionArgs);
break;
caseWORD:
// 解析出想修改的记录ID
longid = 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:
thrownewIllegalArgumentException("未知Uri:"+ uri);
}
// 通知数据已经改变
getContext().getContentResolver().notifyChange(uri,null);
returnnum;
}
// 查询数据的方法
@Override
publicCursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
switch(matcher.match(uri))
{
caseWORDS:
// 执行查询
returndb.query("dict", projection, selection, selectionArgs,
null,null, sortOrder);
caseWORD:
// 解析出想查询的记录ID
longid = ContentUris.parseId(uri);
String where = Words.Word._ID +"="+ id;
// 如果原来的where子句存在,拼接where子句
if(selection !=null&& !"".equals(selection))
{
where = where +" and "+ selection;
}
returndb.query("dict", projection, where, selectionArgs,null,
null, sortOrder);
default:
thrownewIllegalArgumentException("未知Uri:"+ uri);
}
}
// 返回指定uri参数对应的数据的MIME类型
@Override
publicString getType(Uri uri)
{
switch(matcher.match(uri))
{
// 如果操作的数据是多项记录
caseWORDS:
return"vnd.android.cursor.dir/org.crazyit.dict";
// 如果操作的数据是单项记录
caseWORD:
return"vnd.android.cursor.item/org.crazyit.dict";
default:
thrownewIllegalArgumentException("未知Uri:"+ uri);
}
}
}
主Activity文件:DictResolver.java
packagewwj.dictprovider;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.Map;
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.content.Intent;
importandroid.database.Cursor;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassDictResolverextendsActivity
{
ContentResolver contentResolver;
Button insert =null;
Button search =null;
@Override
publicvoidonCreate(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(newOnClickListener()
{
@Override
publicvoidonClick(View source)
{
//获取用户输入
String word = ((EditText)findViewById(R.id.word))
.getText().toString();
String detail = ((EditText)findViewById(R.id.detail))
.getText().toString();
//插入生词记录
ContentValues values =newContentValues();
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(newOnClickListener()
{
@Override
publicvoidonClick(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 ?"
,newString[]{"%"+ key +"%","%"+ key +"%"}
,null);
//创建一个Bundle对象
Bundle data =newBundle();
data.putSerializable("data", converCursorToList(cursor));
//创建一个Intent
Intent intent =newIntent(DictResolver.this
, ResultActivity.class);
intent.putExtras(data);
//启动Activity
startActivity(intent);
}
});
}
privateArrayList> converCursorToList(
Cursor cursor)
{
ArrayList> result
=newArrayList>();
// 遍历Cursor结果集
while(cursor.moveToNext())
{
// 将结果集中的数据存入ArrayList中
Map map =newHashMap();
// 取出查询记录中第2列、第3列的值
map.put(Words.Word.WORD, cursor.getString(1));
map.put(Words.Word.DETAIL, cursor.getString(2));
result.add(map);
}
returnresult;
}
}
ResultActivity.java
packagewwj.dictprovider;
importjava.util.List;
importjava.util.Map;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.widget.ListView;
importandroid.widget.SimpleAdapter;
publicclassResultActivityextendsActivity{
@Override
protectedvoidonCreate(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> list =
(List>)data.getSerializable("data");
//将List封装成SimpleAdapter
SimpleAdapter adapter =newSimpleAdapter(ResultActivity.this, list, R.layout.line
,newString[]{"word","detail"}
,newint[]{R.id.word, R.id.detail});
//填充ListView
listView.setAdapter(adapter);
}
}