android开发 - Content Provider 内容提供者



内容提供者:对外共享数据,让应用间可以访问数据


所共享的数据是任意类型的,可以是数据库,xml,txt文件


统一了数据的访问方式




1.新建一个类,继承 ContentProvider,会重写父类的方法
  public class PersonProvider extends ContentProvider {


//当该类被实例化时被系统调用,只调用一次,一般用作数据初始化
@Override
public boolean onCreate() { 
return false;
}


//允许外部应用程序来内容提供者查询的操作
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) { 
return null;
}


//返回要操作的数据的内容类型
@Override
public String getType(Uri uri) { 
return null;
}


//允许外部应用到内容提供者插入数据
@Override
public Uri insert(Uri uri, ContentValues values) { 
return null;
}


//允许外部应用到内容提供者删除数据
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) { 
return 0;
}


//允许外部应用到内容提供者更新数据
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) { 
return 0;

}
  


2.在清单中配置,外界可以访问该内容,必须是唯一标识,必须在   android系统的唯一标识,建议以公司的域名为名称,


  <provider android:name=".PersonProvider"            android:authorities="com.enenya.provides.personproviders" />
   这个authorities是访问的唯一标识




3.如路径:
  content://com.enenya.provides.personprovides/person/10
  content://   表示架构
  com.enenyaprovides.personprovider  表示主机名或authorities
  /person     表示路径  (这里的person指的是表,也可以是其它的,比如是文件)
  /10         ID   










以下代码是操作


1.先创建一个SQLiteOpenHelper操作类
  
  public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
super(context, "EnenyaDB.db", null, 1);
}


@Override
public void onCreate(SQLiteDatabase db) {
String sql = " create table person "; 
sql += " ( ";
sql += " personid integer primary key not null, ";
sql += " name varchar(50) null, ";
sql += " age integer null, ";
sql += " address text null ";
sql += " ) ";
db.execSQL(sql);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" alter table person add amount integer ");

}




2.创建一个继承ContentProvider类
  重写必要的方法
  
public class PersonProvider extends ContentProvider {


private DBOpenHelper dbOpenHelper;
// 检测Uri是否匹配
private static final UriMatcher MATCHER = new UriMatcher(
UriMatcher.NO_MATCH);
private static final int PERSONS = 1;
static {
// 添加Uri,路劲是person,匹配码是1
MATCHER.addURI("com.enenya.provides.personprovides", "person", PERSONS);
}


// 当该类被实例化时被系统调用,只调用一次,一般用作数据初始化
@Override
public boolean onCreate() {
dbOpenHelper = new DBOpenHelper(this.getContext());
return false;
}


// 允许外部应用程序来内容提供者查询的操作
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}


// 返回要操作的数据的内容类型
@Override
public String getType(Uri uri) {
return null;
}


// 允许外部应用到内容提供者插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
Uri insertUri = null;
switch (MATCHER.match(uri)) {
case 1:
long rowid = db.insert("person", "name", values);
//返回新增加的这条记录的Uri
   insertUri = Uri.parse("content://com.enenya.provides.personprovides/person/"+rowid);
//第二种 都可以
   //insertUri = ContentUris.withAppendedId(uri, rowid);
   break;
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
return insertUri;
}


// 允许外部应用到内容提供者删除数据
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//示例暂时不写了
return 0;
}


// 允许外部应用到内容提供者更新数据
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
//示例不写了
return 0;
}
}




3.从另一个应用调用这个应用的插入方法,使用内容提供者
  方法为;
    public void testInsert() throws Exception{
Uri uri = Uri.parse("content://com.enenya.provides.personprovides/person");
ContentResolver resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 21);
values.put("address", "bejing city");
resolver.insert(uri, values);

}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。