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

android开发 - Content Provider 内容提供者

2015-04-05 20:19 204 查看
内容提供者:对外共享数据,让应用间可以访问数据

所共享的数据是任意类型的,可以是数据库,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);

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