您的位置:首页 > 移动开发 > Android开发

android内容提供者ContentProvider

2013-07-02 08:47 302 查看
URL:网站地址

Uri:范围更光,表示资源

存储数据的方式:

文件、数据库、共享参数、内容提供者。

内容提供者

1、 定义一个类继承ContentProvder类

2、 注册 <Provider ></provider>
在注册中添加属性 authorities(一般是公司地址)

3、 写一个类继承Activity,在OnCreate()方法中获得内容提供者解析器

ContentResolver observer =MainActivity.this.getContentResolver();

Uri uri =Uri.parse(“content://www.android1.com.cn”);//资源地址

Observer.query(null,null,null,null);//
操作内容提供者查询方法中的操作

Observer.insert(uri,null);//操作内容提供者插入方法中的操作

注意:在其他项目中访问内容提供者需要加

ContentValues value = new ContentValues();

Observer.insert(uri,value);

注意:在其他项目中访问内容提供者两个类的包名不能一样

注意:访问内容提供者之前需要发布内容提供者

有关数据库的内容提供者

1、创建数据库

packagecom.example.androidcontentprovider;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
publicclassDBOpenHelper
extends SQLiteOpenHelper {

publicDBOpenHelper(Context context) {

super(context,"data.db",
null,1);

//TODO Auto-generated constructor stub

}

@Override

publicvoidonCreate(SQLiteDatabase db) {

db.execSQL("createtable User(_id Integer primary key autoincrement,name text)");

}

@Override

publicvoidonUpgrade(SQLiteDatabase db,
int oldVersion,
intnewVersion) {

//TODO Auto-generated method stub

}
}

2、在内容提供者里面做增删改查操作

packagecom.example.androidcontentprovider;
importandroid.content.ContentProvider;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
import android.net.Uri;
publicclass MyContentProviderextends
ContentProvider {

SQLiteDatabasedb =
null;

@Override

publicbooleanonCreate() {

DBOpenHelperhelper = new DBOpenHelper(this.getContext());

db =helper.getWritableDatabase();

returntrue;

}

@Override

publicCursor query(Uri uri, String[] projection, String selection,

String[]selectionArgs, String sortOrder) {

returndb.query("User",projection, selection, selectionArgs,
null,
null,sortOrder);

}

@Override

publicString getType(Uri uri) {

//TODO Auto-generated method stub

returnnull;

}

@Override

publicUri insert(Uri uri, ContentValues values) {

db.insert("User",
"_id",values);

returnuri;

}

@Override

publicintdelete(Uri uri, String selection, String[] selectionArgs) {

int i=
db.delete("User",selection, selectionArgs);

return i;

}

@Override

publicintupdate(Uri uri, ContentValues values, String selection,

String[]selectionArgs) {

int
i
= db.update("User",values, selection, selectionArgs);

return 0;

}
}
4、 在有内容对内容提供者的操作类的AndroidManifest中加权限和包

AndroidManifestàapplication外面加:

<instrumentation
android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.example.androidcontentprovider1"></instrumentation>

AndroidManifestàapplication里面加:

<uses-library
android:name="android.test.runner"/>

5、在其他项目中测试

写一个继承AndroidTestCase
做增删改查的操作

packagecom.example.androidcontentprovider1;
importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.database.Cursor;
import android.net.Uri;
importandroid.test.AndroidTestCase;
import android.util.Log;
publicclassTestMyContentProvider
extends AndroidTestCase {

ContentResolverresolver =
null;

Uriuri = null;

@Override

protectedvoidsetUp()
throws Exception {

resolver =
this
.getContext().getContentResolver();

uri =Uri.parse("content://www.android1.com.cn");

super.setUp();

}

publicvoidtestInsert(){

ContentValuesvalues = new ContentValues();

values.put("name",
"lisi");

resolver.insert(uri,values);

}

publicvoidtestDelete(){

resolver.delete(uri,
"_id=?",
newString[]{String.valueOf(2)});

}

publicvoidtestUpdate(){

ContentValuesvalues = new ContentValues();

values.put("name",
"zhangsan");

resolver.update(uri,values,
"_id=?",
newString[]{String.valueOf(3)});

}

publicvoidtestQuery(){

Cursorc = resolver.query(uri,
null,
null,
null,
null);

while(c.moveToNext()){

Log.i("query",c.getString(c.getColumnIndex("name")));

}

c.close();

}

}
内容匹配:(加监听可以及时更新数据)
publicclassMyContentProvider
extends ContentProvider{

SQLiteDatabasedb =
null;

//内容匹配

privatestaticUriMatcher
matcher =
newUriMatcher(UriMatcher.NO_MATCH);

privatestaticfinalintUsers =1;

privatestaticfinalintUser =2;

static{

//添加匹配类型 #
表示任意数字

matcher.addURI("www.android1.com.cn",
"Users",
Users);

matcher.addURI("www.android1.com.cn",
"Users/#",
User);

}

@Override

publicbooleanonCreate() {

DBOpenHelperhelper = new DBOpenHelper(this.getContext());

db =helper.getWritableDatabase();

returntrue;

}

//Uri"content://www.android1.com.cn/Users"

//Uri"content://www.android1.com.cn/Users/2"

@Override

publicCursor query(Uri uri, String[] projection, String selection,

String[]selectionArgs, String sortOrder) {

longid;

switch (matcher.match(uri)){

caseUsers:

return
db.query("Users",projection, selection, selectionArgs,
null,
null,sortOrder);

caseUser:

//剔除Uri

id= ContentUris.parseId(uri);

Stringselections = null;

selections= "_id="+id;

if(selection!=null &
"".equals(selection)){

selections+= " and "+selection;

}

return
db.query("Users",projection, selections, selectionArgs,
null,
null,sortOrder);

default:

thrownewIllegalArgumentException("Uri:
"+uri);

}

}

@Override

publicString getType(Uri uri) {

//TODO Auto-generated method stub

returnnull;

}

//Uri"content://www.android1.com.cn/Users"

@Override

publicUri insert(Uri uri, ContentValues values) {
//

switch (matcher.match(uri)){

caseUsers:
//监听数据

this.getContext().getContentResolver().notifyChange(uri,null);

db.insert("Users",
"_id",values);

break;

default:

thrownewIllegalArgumentException("Uri:
"+uri);

}

returnuri;

}

@Override

publicintdelete(Uri uri, String selection, String[] selectionArgs) {

int i= 0;

longid;

switch (matcher.match(uri)){

caseUsers:

i= db.delete("Users",selection, selectionArgs);

break;

caseUser:

id= ContentUris.parseId(uri);

Stringselections = null;

selections= "_id="+id;

if(selection!=
null & selection.equals("")){

selections+= "and"+selection;

}

i= db.delete("Users",selections, selectionArgs);

default:

break;

}

return i;

}

@Override

publicintupdate(Uri uri, ContentValues values, String selection,

String[]selectionArgs) {

int i= 0;

longid;

switch (matcher.match(uri)){

caseUsers:

i= db.update("Users",values, selection, selectionArgs);

break;

caseUser:

id= ContentUris.parseId(uri);

Stringselections = null;

selections= "_id="+id;

if(selection!=
null & selection.equals("")){

selections+= "and" + selection;

}

i= db.update("Users",values, selections, selectionArgs);

break;

default:

break;

}

return i;

}

}

publicclassTestMyContentProvider
extends AndroidTestCase{

ContentResolverresolver =
null;

@Override

protectedvoidsetUp()
throws Exception {

resolver =
this
.getContext().getContentResolver();

super.setUp();

}

publicvoidtestInsert(){

ContentValuesvalues = new ContentValues();

values.put("name",
"wangchenghua");

resolver.insert(Uri.parse("content://www.android1.com.cn/Users"),values);

}

publicvoidtestQuery(){

//Cursorc = resolver.query(Uri.parse("content://www.android1.com.cn/Users"),null, null, null, null);//查询全部

Cursorc = resolver.query(Uri.parse("content://www.android1.com.cn/Users/1"),
null,
null,
null,
null);//查询第一行

while(c.moveToNext()){

Log.i("msg",c.getString(c.getColumnIndex("name")));

}

c.close();

}

publicvoidtestdelete(){

//删除第三行数据

resolver.delete(Uri.parse("content://www.android1.com.cn/Users"),
"_id= ?",
new String[]{String.valueOf(3)});

//resolver.delete(Uri.parse("content://www.android1.com.cn/Users/3"),"_id = ?", null);

}

publicvoid
testUpdate(){

ContentValuesvalues = new ContentValues();

values.put("name",
"wangchenghua");

//更新第四行数据

resolver.update(Uri.parse("content://www.android1.com.cn/Users/1"),values,
"_id = ?",
null);

//resolver.update(Uri.parse("content://www.android1.com.cn/Users"),values, "_id = ?", new String[]{String.valueOf(4)});

}
}
新建一项目显示数据(更改数据库时并能及时更新数据)
publicclassMainActivity
extends Activity {

ListViewlist;

SimpleCursorAdapteradapter;

ContentResolverresolver ;

Uriuri;

Cursorc;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

list = newListView(this);

setContentView(list);

resolver = this.getContentResolver();

uri =Uri.parse("content://www.android1.com.cn/Users");

resolver.registerContentObserver(uri,
true,
newMyContentObserver(new Handler()));

c = resolver.query(uri,
null,
null,
null,
null);

adapter = new
SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,
c,
newString[]{"name"},
newint[]{android.R.id.text1});

list.setAdapter(adapter);

}

classMyContentObserver
extends ContentObserver{

publicMyContentObserver(Handler handler) {

super(handler);

}

@Override

publicvoidonChange(boolean selfChange) {

super.onChange(selfChange);

Toast.makeText(MainActivity.this,
"Change", 1).show();

c = resolver.query(uri,
null,
null,
null,
null);

adapter =
new
SimpleCursorAdapter(MainActivity.this,android.R.layout.simple_list_item_1,
c,
newString[]{"name"},
newint[]{android.R.id.text1});

list.setAdapter(adapter);

}

}

@Override

publicbooleanonCreateOptionsMenu(Menu menu) {

//Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main,menu);

returntrue;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: