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;
}
}
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;
}
}
相关文章推荐
- Android ContentProvider的基本使用1(内容提供者)
- Android开发14——监听内容提供者ContentProvider的数据变化
- Android四大组件之一之内容提供者ContentProvider
- Android四大组件之一ContentProvider(内容提供者)
- Android四大组件之ContentProvider(内容提供者)01
- Android内容提供者(ContentProvider)浅析(二)
- Android四大组件之一ContentProvider内容提供者(继SQLite数据存储篇)
- Android开发13――内容提供者ContentProvider的基本使用
- Android 之使用ContentProvider(内容提供者)共享数据
- Android自助餐之内容提供者ContentProvider使用
- Android ContentProvider(内容提供者)
- Android -- ContentProvider 内容提供者,创建和调用
- Androidx学习笔记(81)--- 内容提供者(ContentProvider)
- Android四大组件之ContentProvider(内容提供者)
- Android组件系列----ContentProvider内容提供者
- Android内容提供者(ContentProvider)浅析(三)
- Android组件系列----ContentProvider内容提供者
- Android四大组件之ContentProvider(内容提供者)02
- Android之内容提供者ContentProvider的总结
- android 内容提供者(ContentProvider)共享SQLite