Android存储--ContentProvider
来源:互联网 发布:java jsonarray清空 编辑:程序博客网 时间:2024/06/08 03:52
一, 什么是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;@Overrideprotected 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 stubList<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}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.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')");}@Overridepublic 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);}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubopenHelp = new DataOpenHelp(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteDatabase 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;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSQLiteDatabase 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;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubSQLiteDatabase db = openHelp.getWritableDatabase();int count = 0;if (uriMatcher.match(uri) == USER_CODE) {count = db.delete("t_user", selection, selectionArgs);}return count;}@Overridepublic 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");@Overrideprotected 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);}}
0 0
- android存储方式ContentProvider
- Android存储-ContentProvider
- Android存储--ContentProvider
- Android 数据存储之ContentProvider
- android数据存储之contentProvider
- Android数据存储之ContentProvider
- android数据存储之ContentProvider
- Android数据存储-ContentProvider总结
- Android数据存储之ContentProvider
- Android数据存储之ContentProvider存储数据
- Android数据存储方案ContentProvider存储数据
- android数据存储ContentProvider数据获取ContentResolver
- Android数据存储之ContentProvider&Preferences
- android数据存储:ContentProvider数据共享
- Android存储 sharedpreference,file,SQlite,contentprovider。
- Android数据的存储方式 ContentProvider
- Android数据存储方式:SharePreference、SQLite、ContentProvider
- Android数据存储方式之:ContentProvider
- C++——算法基础之排序——堆排序
- 学习日记20160912
- 数据结构实验之链表六:有序链表的建立
- [verilog读书笔记]6.数据流建模
- commons-logging与log4j学习总结
- Android存储--ContentProvider
- 理解金纳米晶体的光热转换效率
- 做人要问心无愧
- 剪切板的操作
- 第三周项目2-建设“顺序表”算法库
- 【LightOJ 1030】Discovering Gold(期望DP)
- 商业化IM 客户端接口设计分析
- 《GPU高性能编程CUDA实战》学习笔记(七)
- 乘法逆元小结