安卓手机与linux共享数据,Android开发学习之使用ContentProvider实现数据共享

ContentProvider是我学习安卓这几个月以来碰到最难理解的一块,感觉很难掌握,不知道如何使用这一块内容,有些方法的参数使用起来真的是令人发指,我也不打算一下子把全部内容都运用自如,那是不可能的事情,下面是学习ContentProvider所实现的一个实例:

实例:使用ContentProvider共享生词本数据

这个实例可以简单实现添加生词和查询生词的功能,我原本想扩展一下这个应用程序的功能,但却不知道从何做起,只是简简单单换了了界面背景就是了。

创建项目:DictProvider

项目运行效果:

ad6f44f765c99db56ce228b524bebc47.png

f8e4461f1b27f85578a3be9978fdd118.png

下面只给出主要代码布局文件和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);

}

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值