《android 学习笔记12-内容提供者.docx》由会员分享,可在线阅读,更多相关《android 学习笔记12-内容提供者.docx(10页珍藏版)》请在金锄头文库上搜索。
1、android 学习笔记12-内容提供者1、内容提供者实际的开发中,一般也比较少开发自定义的内容提供者,一般都是使用应用的数据库是不允许其他应用访问的内容提供者的作用就是让别的应用访问到你的私有数据,就是一个java类自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法使用内容提供者可以自己定义访问规则,选择私有数据中哪些共享出去,哪些不共享注意(特别重要):我们一定要认真配置清单文件xml代码演示:a,内容提供者的xml文件配置 b,内容提供者定义: public class PersonProvider extends Con
2、tentProvider /继承ContentProvider,重写里面的方法 private SQLiteDatabase db; /内容提供者创建时调用 Override public boolean onCreate() MyOpenHelper oh = new MyOpenHelper(getContext(); db = oh.getWritableDatabase(); return false; /values:其他应用要插的数据 Override public Uri insert(Uri uri, ContentValues values) /插入 db.insert(pe
3、rson, null, values);/这里的values是调用者传进来的数据,因为我们内容提供者自己肯定不会去插数据的 return uri; Override public int delete(Uri uri, String selection, String selectionArgs) /删除 int i = 0; i = db.delete(person, selection, selectionArgs); return i; Override public int update(Uri uri, ContentValues values, String selection,
4、String selectionArgs) /修改 int i = db.update(person, values, selection, selectionArgs); return i; Override public Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder) /查询 Cursor cursor = null; cursor = db.query(person, projection, selection, selectionArgs
5、, null, null, sortOrder, null); return cursor; c,我们访问者定义 public class MainActivity extends Activity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); public void insert(View v) /通过内容提供者把数据插入01数据库 /1.获取contentResolv
6、er ContentResolver resolver = getContentResolver(); /2.访问内容提供者,插入数据 ContentValues values = new ContentValues(); values.put(name, 张三); values.put(phone, 123456); values.put(money, 10000); /arg0:指定内容提供者的主机名 resolver.insert(Uri.parse(content:/com.example.people), values); values.clear(); values.put(nam
7、e, 李四); values.put(phone, 12345); /arg0:指定内容提供者的主机名 resolver.insert(Uri.parse(content:/com.example.people), values); public void delete(View v) ContentResolver resolver = getContentResolver(); int i = resolver.delete(Uri.parse(content:/com.example.people), name = ?, new String张三); System.out.println
8、(i); public void update(View v) ContentResolver resolver = getContentResolver(); ContentValues values = new ContentValues(); values.put(money, 10001); int i = resolver.update(Uri.parse(content:/com.example.people), values, name = ?, new String张三); System.out.println(i);/更新的记录数 public void query(View
9、 v) ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(Uri.parse(content:/com.example.people), null, null, null, null); while(cursor.moveToNext() String name = cursor.getString(1); String phone = cursor.getString(2); String money = cursor.getString(3); System.out.println
10、(name + ; + phone + ; + money); 这样大体的定义和访问就可以实现了,但是还有一些问题2、内容提供者-优化我们发现上面的内容提供者里面的表名都是写死的 db.insert(person, null, values);如果我们现在有个handsome表,想操作它就不行了我们要操作那张表就把表名放到uri里面传过去就行了 resolver.insert(Uri.parse(content:/com.example.people/person), values);那在提供者就去判断下是哪张表,我们可以使用一个API UriMatcher在内容提供者里面添加: /创建uri
11、匹配器 UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);/UriMatcher.NO_MATCH -1 , 如果都不匹配的话就返回-1 /添加匹配规则 /arg0:主机名 /arg1:路径 /arg2:匹配码,这个是自己定义的,如果匹配成功了,就返回这个匹配码 um.addURI(com.example.people, person, 1);/content:/com.example.people/person um.addURI(com.example.people, handsome, 2);/content:/com.example.people/handsome um.addURI(com.example.people, person/#, 3);/content:/com.example.people/person/10