使用contentprovider共享生词本数据

[color=red]摘自李刚<疯狂android>备份学习使用[/color]

首先我们为该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;
}
}



工程代码见附件
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值