1.创建自定义类MyDatabaseHelper继承自SQLiteDatabaseHelper
public class MyDataBaseHelper extends SQLiteOpenHelper{
//建表的常量SQL语句,表名dict,主键_id随加入数据自动+1,两列项word,detail
final String CREATE_TABLE_SQL=
"create table dict(_id integer primary key autoincrement,word,detail)";
//重写父类构造函数
public MyDataBaseHelper(Context context,String name,int verson){
super(context, name, null, verson);
}
//数据库第一次创建时生成,对自带的SQLiteDatebase进行建表
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
arg0.execSQL(CREATE_TABLE_SQL);
}
//重写数据库的升级方法
@Override
public void onUpgrade(SQLiteDatabase db, int Oldversion, int newVersion) {
// TODO Auto-generated method stub
Log.i("onUpgrade", "void onUpgrade");
}
}
其中需要注意的OnCreate方法官方文档如下
![](https://img.haomeiwen.com/i3165951/88e5a12a9425347d.png)
2.在MainActivity中实现数据库的增加,查找操作
public class MainActivity extends Activity {
MyDataBaseHelper dbHelper;
Button insert=null,search=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化数据库建表,参数上下文,数据库文件名,版本号
dbHelper=new MyDataBaseHelper(this, "myDict.db3", 1);
insert=(Button)findViewById(R.id.insert);
search=(Button)findViewById(R.id.search);
insert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String word=((EditText)findViewById(R.id.word)).getText().toString();
String detial=((EditText)findViewById(R.id.detail)).getText().toString();
//将word,detail写入数据库,getReadableDatabase()方法获得可读写数据库
insertData(dbHelper.getReadableDatabase(), word, detial);
Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
}
});
search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String key=((EditText)findViewById(R.id.key)).getText().toString();
//查找数据库中word或detail中带有key字样的数据行,将其保存到cursor
Cursor cursor=
dbHelper.getReadableDatabase().rawQuery
("select * from dict where word like ? or detail like ?",new String[]{"%"+key+"%","%"+key+"%"});
Bundle data=new Bundle();
data.putSerializable("data", converCursorToList(cursor));
Intent intent=new Intent(MainActivity.this,ResultActivity.class);
intent.putExtras(data);
startActivity(intent);
}
});
}
protected ArrayList<Map<String,String>> converCursorToList(Cursor cursor){
ArrayList<Map<String, String>>result=new ArrayList<Map<String,String>>();
//当cursor的移动到的下一行不为空
while(cursor.moveToNext()){
Map<String, String>map=new HashMap<>();
//分别将第二列,第三列中的数据写入map
map.put("word", cursor.getString(1));
map.put("detail", cursor.getString(2));
result.add(map);
}
return result;
}
private void insertData(SQLiteDatabase db,String word,String detial){
//将word,detail写入数据库,主键设置为null实现自+1
db.execSQL("insert into dict values(null,?,?)",new String[]{word,detial});
}
@Override
protected void onDestroy() {
// 关闭数据库
super.onDestroy();
if(dbHelper!=null){
dbHelper.close();
}
}
}
3.为ContentProvider写工具类Words便于维护
public final class Words {
//ContentProvider的Authority
public static final String AUTHORITY="com.example.mydict";
public static final class Word implements BaseColumns{
//允许操作的数据列
public final static String _ID="_id";
public final static String WORD="word";
public final static String DETAIL="detail";
//提供服务的URI
public final static Uri DIC_CONTENT=Uri.parse("content://"+AUTHORITY+"/words");
public final static Uri WORD_CONTENT=Uri.parse("content://"+AUTHORITY+"/word");
}
}
4.开发ContentProvider子类,重写其中的方法
public class DictProvider extends ContentProvider{
//初始化静态比较对象matcher用于uri的比较
private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
private static final int WORDS=1;
private static final int WORD=2;
private MyDataBaseHelper dbOpenHelper;
//静态块初始化matcher所比较的URI
//如果uri匹配com.example.mydict/words,返回1
//如果uri匹配com.example.mydict/word/任意字符串,返回2
static{
matcher.addURI(Words.AUTHORITY, "words", WORDS);
matcher.addURI(Words.AUTHORITY, "word/#", WORD);
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
int num=0;
switch(matcher.match(uri)){
case WORDS:
num=db.delete("dict", where, whereArgs);
break;
case WORD:
long id=ContentUris.parseId(uri);
String whereClause=Words.Word._ID+"="+id;
if(where!=null&&!where.equals("")){
whereClause=whereClause+" and "+where;
}
num=db.delete("dict", whereClause, whereArgs);
break;
default:
throw new IllegalArgumentException("未知UrI"+uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return num;
}
@Override
public String getType(Uri arg0) {
switch (matcher.match(arg0)) {
case WORDS:
return "vnd.android.cursor.dir/com.example.mydict";
case WORD:
return "vnd.android.cursor.item/com.example.mydict";
default:
throw new IllegalArgumentException("未知uri"+arg0);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
switch(matcher.match(uri)){
case WORDS:
long rowId=db.insert("dict", Words.Word._ID, values);
if(rowId>0){
//在已有uri后增加rowId
Uri wordUri=ContentUris.withAppendedId(uri, rowId);
//通知数据已经改变
getContext().getContentResolver().notifyChange(wordUri, null);
return wordUri;
}
break;
default:
throw new IllegalArgumentException("未知URI"+uri);
}
return null;
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
dbOpenHelper=new MyDataBaseHelper(this.getContext(), "myDict.db3", 1);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs,
String sortOrder) {
SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
switch (matcher.match(uri)) {
case WORDS:
return db.query("dict", projection, where, whereArgs, null, null, sortOrder);
case WORD:
long id=ContentUris.parseId(uri);
String whereClause=Words.Word._ID+"="+id;
if(where!=null&&!"".equals(where)){
whereClause=whereClause+" and "+where;
}
return db.query("dict", projection, whereClause, whereArgs, null, null, sortOrder);
default:
throw new IllegalArgumentException("未知URI"+uri);
}
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
int num=0;
switch (matcher.match(uri)) {
case WORDS:
num=db.update("dict", values, where, whereArgs);
break;
case WORD:
long id=ContentUris.parseId(uri);
String whereClause=Words.Word._ID+"="+id;
if(where!=null&&!where.equals("")){
whereClause=whereClause+" and "+id;
}
db.update("dict", values, whereClause, whereArgs);
break;
default:throw new IllegalArgumentException("未知URI"+uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return num;
}
}
5.在新的应用中编写工具类(同原应用)
public final class Words
{
// 定义该ContentProvider的Authority
public static final String AUTHORITY
= "com.example.mydict";
//定义一个静态内部类
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");
}
}
6.在新的应用的MainActivity中通过ContentReceiver调用ContentProvider中的查找,插入方法,使得两个应用共享数据库
public class MainActivity extends Activity {
ContentResolver contentResolver;
Button insert,search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver=getContentResolver();
insert=(Button)findViewById(R.id.insert);
search=(Button)findViewById(R.id.search);
insert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
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(MainActivity.this, "添加成功",Toast.LENGTH_SHORT).show();
}
});
search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
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 data=new Bundle();
data.putSerializable("data", converCursorToList(cursor));
Intent intent=new Intent(MainActivity.this,ResultActivity.class);
intent.putExtras(data);
startActivity(intent);
}
});
}
protected 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("word", cursor.getString(1));
map.put("detail", cursor.getString(2));
result.add(map);
}
return result;
}
}
网友评论