一, 什么是ContentProvider
是所有应用程序之间数据存储和检索的桥梁, 作用 是实现各个应用程序之间数据的共享
是应用程序之间数据共享的唯一方式
注意:
如果想要访问内容提供者提供的数据, 那么需要通过 ContentResolver对象获取数据的内容
如果想要共享自己应用程序中的数据, 那么需要自定义一个内容提供者, 然后把自己的数据共享出去
二, 作用
将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式 ,向外提供数据访问的接口
三, URI 统一资源标识符 (在应用程序中是唯一的)
格式: content://应用程序的包名.provider/表名(一般自定义)
四, 分析
ContentResolver 内容解析器 负责解析ContentProvider暴露出来的数据 "客户端"
ContentProvider 内容提供者 负责暴露数据 "服务器"
1, 定义一个类, 继承ContentProvider, 重写父类的6个方法
onCreate() 初始化数据库的操作
query(Uri uri,...)
insert(Uri uri,...)
delete(Uri uri,...)
update(Uri uri,...)
getType() 只实现, 不做处理
2, 声明ContentProvider的唯一标识(内容为小写的字母, 建议 : 包名+数据库的名称)
3, 声明访问数据库的Code码(是在CotentProvider暴露数据时, 使用)
4, 定义Uri的匹配器 UriMatcher , 并且实例化, 同时注册Uri
private static UriMatcher uriMatcher ;
static
{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);
}
5, 定义一个数据库的帮助类, 并在onCreate() 方法中完成数据表的初始
6, 在相应的增 删 改 查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code
if(uriMatcher.match(uri) == code)
{........}
7, 在清单文件中, 注册ContentProvider
<provider
android:name="" 说明注册的是那个CotentProvider 全类名
android:authorities="" 与CotentProvider中的 唯一标识完全一直
android:exported="" 声明当前应用程序 可以被外部的应用程序访问/>
是所有应用程序之间数据存储和检索的桥梁, 作用 是实现各个应用程序之间数据的共享
是应用程序之间数据共享的唯一方式
注意:
如果想要访问内容提供者提供的数据, 那么需要通过 ContentResolver对象获取数据的内容
如果想要共享自己应用程序中的数据, 那么需要自定义一个内容提供者, 然后把自己的数据共享出去
二, 作用
将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式 ,向外提供数据访问的接口
三, URI 统一资源标识符 (在应用程序中是唯一的)
格式: content://应用程序的包名.provider/表名(一般自定义)
四, 分析
ContentResolver 内容解析器 负责解析ContentProvider暴露出来的数据 "客户端"
ContentProvider 内容提供者 负责暴露数据 "服务器"
实例:
1,访问联系人列表
1, 得到内容解析器对象: ContentResolver
2, 通过URI格式 解析数据(Cursor)
3, 在清单文件中添加读取短信的权限
raw_contacts (有多少个联系人 就有多少条数据)
_id dispaly_name
mimetypes(数据的类型)
_id mimetype (1 邮箱 5 电话 7 姓名)
data(实际的内容) 同一个人会有多条数据, 姓名 , 电话, 邮箱 ....
_id
raw_contact_id (raw_contacts表的外键)
mimetype_id (mimetypes的外键)
代码实现:
public class MainActivity extends Activity {
private ListView lv;
private SimpleAdapter adapter;
private List<Map<String, Object>> data;
private ContentResolver resolver;
private Uri uri = ContactsContract.Contacts.CONTENT_URI;
private Uri phoneuri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private Uri emailuri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
data = getData();
adapter = new SimpleAdapter(this, data, R.layout.lvitem, new String[] {
"id", "name", "phone", "email" }, new int[] { R.id.id,
R.id.name, R.id.phone, R.id.email });
lv.setAdapter(adapter);
}
private List<Map<String, Object>> getData() {
// TODO Auto-generated method stub
List<Map<String, Object>> resultdata = new ArrayList<Map<String, Object>>();
Map<String, Object> map;
// 获取数据
resolver = getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
map = new HashMap<String, Object>();
int id = cursor.getInt(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
map.put("id", id);
map.put("name", name);
String phone = "该用户暂时没有电话";
Cursor cursor1 = resolver.query(phoneuri, null, "raw_contact_id=?",
new String[] { id + "" }, null);
while (cursor1.moveToNext()) {
phone = cursor1
.getString(cursor1
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
map.put("phone", phone);
String email = "该用户暂时没有邮箱";
Cursor emailCursor = resolver.query(emailuri, null,
"raw_contact_id =?", new String[] { id + "" }, null);
while (emailCursor.moveToNext()) {
email = emailCursor
.getString(emailCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
}
map.put("email", email);
resultdata.add(map);
}
return resultdata;
}
}
自定义的ContentProvider
1, 定义一个类, 继承ContentProvider, 重写父类的6个方法
onCreate() 初始化数据库的操作
query(Uri uri,...)
insert(Uri uri,...)
delete(Uri uri,...)
update(Uri uri,...)
getType() 只实现, 不做处理
2, 声明ContentProvider的唯一标识(内容为小写的字母, 建议 : 包名+数据库的名称)
3, 声明访问数据库的Code码(是在CotentProvider暴露数据时, 使用)
4, 定义Uri的匹配器 UriMatcher , 并且实例化, 同时注册Uri
private static UriMatcher uriMatcher ;
static
{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);
}
5, 定义一个数据库的帮助类, 并在onCreate() 方法中完成数据表的初始
6, 在相应的增 删 改 查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code
if(uriMatcher.match(uri) == code)
{........}
7, 在清单文件中, 注册ContentProvider
<provider
android:name="" 说明注册的是那个CotentProvider 全类名
android:authorities="" 与CotentProvider中的 唯一标识完全一直
android:exported="" 声明当前应用程序 可以被外部的应用程序访问/>
实例:
public class DataOpenHelp extends SQLiteOpenHelper {
public DataOpenHelp(Context context) {
super(context, "nba", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table t_user(_id integer primary key autoincrement, uname,upwd,umoney)");
db.execSQL("create table t_order(_id integer primary key autoincrement, product_name,price,user_id)");
db.execSQL("insert into t_user(uname,upwd,umoney) values('詹姆斯','123','100')");
db.execSQL("insert into t_user(uname,upwd,umoney) values('科比','667','100')");
db.execSQL("insert into t_user(uname,upwd,umoney) values('库里','321','100')");
db.execSQL("insert into t_user(uname,upwd,umoney) values('汤普森','135','100')");
db.execSQL("insert into t_user(uname,upwd,umoney) values('欧文','165','100')");
db.execSQL("insert into t_user(uname,upwd,umoney) values('杜兰特','145','100')");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public class UserContentProvider extends ContentProvider {
private DataOpenHelp openHelp;
private static final int USER_CODE = 0;
private static final int ORDER_CODE = 1;
private static UriMatcher uriMatcher;
private static String AUTHORITY = "com.example.day46_contentprovider_03.nba";
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "t_user", 0);
uriMatcher.addURI(AUTHORITY, "t_order", 1);
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
openHelp = new DataOpenHelp(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
SQLiteDatabase db = openHelp.getWritableDatabase();
Cursor sCursor = null;
switch (uriMatcher.match(uri)) {
case USER_CODE:
sCursor = db.query("t_user", null, selection, selectionArgs, null,
null, null);
break;
case ORDER_CODE:
sCursor = db.query("t_order", null, selection, selectionArgs, null,
null, null);
break;
}
return sCursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = openHelp.getWritableDatabase();
long id;
if (uriMatcher.match(uri) == USER_CODE) {
id = db.insert("t_user", null, values);
return ContentUris.withAppendedId(uri, id);
}
if (uriMatcher.match(uri) == ORDER_CODE) {
id = db.insert("t_order", null, values);
return ContentUris.withAppendedId(uri, id);
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = openHelp.getWritableDatabase();
int count = 0;
if (uriMatcher.match(uri) == USER_CODE) {
count = db.delete("t_user", selection, selectionArgs);
}
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = openHelp.getWritableDatabase();
int count = 0;
if (uriMatcher.match(uri) == USER_CODE) {
count = db.update("t_user", values, selection, selectionArgs);
}
return count;
}
}
<provider
android:name="com.example.contentprovider_03DB.UserContentProvider"
android:authorities="com.example.day46_contentprovider_03.nba"
android:exported="true"
/>
ContentResolver部分:
public class MainActivity extends Activity {
private ListView lv;
private SimpleCursorAdapter list;
private ContentResolver resolver;
private Uri uri = Uri
.parse("content://com.example.day46_contentprovider_03.nba/t_user");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
resolver = getContentResolver();
}
public void show(View v) {
Cursor cursor = resolver.query(uri, null, null, null, null);
list = new SimpleCursorAdapter(this, R.layout.lvitem, cursor,
new String[] { "uname", "upwd" },
new int[] { R.id.t1, R.id.t2 },
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(list);
}
public void insert(View v) {
ContentValues values = new ContentValues();
values.put("uname", "哈登");
values.put("upwd", "09876");
resolver.insert(uri, values);
show(null);
}
public void update(View v) {
ContentValues values = new ContentValues();
values.put("uname", "哈登1111");
resolver.update(uri, values, "upwd = ?", new String[] { "09876" });
show(null);
}
public void delete(View v) {
resolver.delete(uri, "_id=?", new String[] { "1" });
show(null);
}
}