上节学习了什么是ContentProvider。以及ContentProvider的作用。以及什么是URL。本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider

好。实践是检验真理的唯一标准。 那我们就開始行动吧

第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider

  1. public class MyContentProvider extends ContentProvider {
  2.  
  3. @Override
  4. public int delete(Uri arg0, String arg1, String[] arg2) {
  5. // TODO Auto-generated method stub
  6. return 0;
  7. }
  8.  
  9. @Override
  10. public String getType(Uri arg0) {
  11. // TODO Auto-generated method stub
  12. return null;
  13. }
  14.  
  15. @Override
  16. public Uri insert(Uri arg0, ContentValues arg1) {
  17. // TODO Auto-generated method stub
  18. return null;
  19. }
  20.  
  21. @Override
  22. public boolean onCreate() {
  23. // TODO Auto-generated method stub
  24. return false;
  25. }
  26.  
  27. @Override
  28. public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
  29. String arg4) {
  30. // TODO Auto-generated method stub
  31. return null;
  32. }
  33.  
  34. @Override
  35. public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
  36. // TODO Auto-generated method stub
  37. return 0;
  38. }
  39. }

这些方法非常熟悉吧。 这不是数据库常见的增删改查吗? 原来ContentProvider为我们提供了所以的数据库的操作。我们仅仅需调用实现就可以。

第二步: 创建一个SQLiteOpenHelper类,我取名为MyDbOpenHelper

  1. public class MyDbOpenHelper extends SQLiteOpenHelper {
  2.  
  3. public String TABLE_NAME="user";
  4. public MyDbOpenHelper(Context context) {
  5. super(context, "user.db", null, 1);
  6. // TODO Auto-generated constructor stub
  7. }
  8.  
  9. @Override
  10. public void onCreate(SQLiteDatabase db) {
  11. // TODO Auto-generated method stub
  12. db.execSQL("create table user(_id integer primary key autoincrement, name char(10), age integer(2), salary integer(10))");
  13. }
  14.  
  15. @Override
  16. public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
  17. // TODO Auto-generated method stub
  18.  
  19. }
  20. }

在create方法中创建table为user的数据表

第三步: 在配置文件里注冊ContentProvider

  1. <provider android:name="com.ui.contentprovider.MyContentProvider"
  2. android:authorities="com.ui.contentprovider" url路径
  3. android:exported="true"> 暴露自己须要打开
  4. </provider>

第四步:再创建一个Activity。用于插入数据。布局文件为四个button

既然一切都准备好了。

我们就插入一组数据:

Activity的OnCreate方法

  1. public class MainActivity extends Activity {
  2.  
  3.     ContentResolver cResolver;
  4.     //得到自定义的ContentProvider的url
  5.     Uri uri=Uri.parse("content://com.ui.contentprovider/");
  6.     
  7.     @Override
  8.     protected void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         setContentView(R.layout.activity_main);
  11.         /*得到ContentResolver*/
  12.         cResolver = getContentResolver();   
  13.     }

当点击insertbutton后须要插入的数据

  1. public void insert(View v)
  2. {
  3. Log.i("MainActivity", "---------insert");
  4. ContentValues values = new ContentValues();
  5.  
  6. values.put("name", "张三");
  7. values.put("age", 20);
  8. values.put("salary", 13000);
  9. cResolver.insert(uri, values);
  10.  
  11. values.put("name", "李四");
  12. values.put("age", 19);
  13. values.put("salary", 10000);
  14. cResolver.insert(uri, values);
  15.  
  16. values.put("name", "王五");
  17. values.put("age", 40);
  18. values.put("salary", 200000);
  19. cResolver.insert(uri, values);
  20.  
  21. values.put("name", "朱八");
  22. values.put("age", 10);
  23. values.put("salary", 2000);
  24. cResolver.insert(uri, values);
  25. }

此时ContentProvider中给第三方提供的insert方法须要实现:

  1. public class MyContentProvider extends ContentProvider {
  2.  
  3. private MyDbOpenHelper dhHelper;
  4. private SQLiteDatabase db;
  5.  
  6. @Override
  7. public boolean onCreate() {
  8. Log.i("MyContentProvider", "onCreate");
  9.  
  10. //调用MyDbOpenHelper的onCreate方法创建数据库
  11. dhHelper = new MyDbOpenHelper(getContext());
  12. db = dhHelper.getWritableDatabase();
  13. return false;
  14. }
  15.  
  16. //插入第三方应用的数据
  17. @Override
  18. public Uri insert(Uri uri, ContentValues values) {
  19. Log.i("MyContentProvider", "insert");
  20. db.insert(dhHelper.TABLE_NAME, null, values);
  21. return uri;
  22. }

測试例如以下: 先执行ContentProvider所在的Activity。 在执行第三方应用,得到结果为:

接下来,看一下删除的操作, 我们删除名字为王五的同学:

Activity中当点击deletebutton后:

  1. public void delete(View v)
  2. {
  3. Log.i("MainActivity", "---------delete");
  4. cResolver.delete(uri, "name = ?", new String[]{"王五"});
  5. }

ContentProvider中的delete须要改为:

  1. @Override
  2. public int delete(Uri arg0, String whereClause, String[] whereArgs) {
  3. Log.i("MyContentProvider", "delete");
  4. db.delete(dhHelper.TABLE_NAME, whereClause, whereArgs);
  5. return 0;
  6. }

执行结果为:

接下来学习改动操作, 因为朱八同学近期表现比較好,老板给加薪了。

加了500

activity当点击updatebutton运行的操作:

  1. public void update(View v)
  2. {
  3. Log.i("MainActivity", "---------update");
  4. ContentValues values = new ContentValues();
  5. values.put("salary", 2500);
  6. cResolver.update(uri, values, "name = ?", new String[]{"朱八"});
  7. }

ContentProvider中改动为:

  1. @Override
  2. public int update(Uri arg0, ContentValues values, String whereClause, String[] whereArgs) {
  3. Log.i("MyContentProvider", "update");
  4. int id = db.update(dhHelper.TABLE_NAME, values, whereClause, whereArgs);
  5. return id;
  6. }

执行效果为:

接下来最后一个操作,查询操作。查询工资大于等于10000的:

Activity的代码:

  1. public void query(View v)
  2. {
  3. Cursor cursor = cResolver.query(uri, null, "salary >= ?
  4.  
  5. ", new String[]{"10000"}, null);
  6. Log.i("MainActivity", "---------query");
  7. while(cursor.moveToNext())
  8. {
  9. String name = cursor.getString(cursor.getColumnIndex("name"));
  10. int age = cursor.getInt(cursor.getColumnIndex("age"));
  11. int salary = cursor.getInt(cursor.getColumnIndex("salary"));
  12. System.out.println(name + ";" + age + ";" + salary);
  13. }
  14. }

ContentProvider中的须要改动的代码:

  1. @Override
  2. public Cursor query(Uri arg0, String[] projection, String selection, String[] selectionArgs,
  3. String sortOrder) {
  4. Log.i("MyContentProvider", "query");
  5. Cursor cursor = db.query(dhHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
  6. return cursor;
  7. }

串口的打印:

好, 关于自定义自己的ContentProvider就到这里,我们实现了所以的增删改查操作。

Android 四大组件学习之ContentProvider二的更多相关文章

  1. Android 四大组件学习之ContentProvider五

    上几节学习了ContentProvider的实际用途,读取短信.插入短信,读取联系人.插入联系人等. 本节课在学习ContentProvider的观察者. 在生活中有第三方的软件.比方什么短信软件.此 ...

  2. Android 四大组件学习之ContentProvider三

    上节课学习怎样自己创建一个ContentProvider.以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的 ...

  3. Android 四大组件学习之ContentProvider四

    上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. wa ...

  4. Android 四大组件学习之BroadcastReceiver二

    上节学习了怎样创建一个广播.也尝试接受系统打电话的广播. 本节课学习怎样自己定义广播.自己定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就開始行动吧. 先创建一个发送广播的应用 ...

  5. android四大组件学习总结以及各个组件示例(1)

    android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...

  6. Android 四大组件之 Activity(二)

    1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...

  7. Android 四大组件学习之Server一

    上次学习了Android四大组件Activity之后,我们深刻理解了Activity.这次我们学习四大组件Service. Service与Activity的级别是一样的,都是Android系统不可缺 ...

  8. Android 四大组件学习之BroadcastReceiver一

    本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比方在现实社会中,曾经每一个人家都有一台收音机,这可就能够去接受广播发出来的消息.大家都知道.程序世界也是參照的显示生活设 ...

  9. Android四大组件之一:ContentProvider(内容提供者)

    Android中还提供了名为ContentProvider(内容提供者),可以向其他应用提供数据,但不常用,除非是同一公司开发的App,可以向不同应用提供数据.虽然为Android的四大组件之一,但用 ...

随机推荐

  1. python--5、包

    包 包,即一个包含__init__.py文件的文件夹,创建包的目的也就是为了用文件夹将文件(模块)组织起来.python3中,即使包里没有__init__.py文件,仍能import使用.而pytho ...

  2. Android5.1关机充电界面尺寸修改

    Android5.1关机充电界面尺寸修改 因为项目的屏幕尺寸和一般的手机屏幕不一样,因此关机充电界面在设备上运行后严重变形,就需要自己修改这个界面了,废话不多说了,开打开打! 首先要说明这里是以And ...

  3. 努比亚 N2(Nubia NX575J) 解锁BootLoader 并进入临时recovery ROOT

    工具下载链接:https://pan.baidu.com/s/1jJoK2Yq 备用下载链接:https://pan.baidu.com/s/1snjwLdz 密码:71rg 本篇教程教你如何傻瓜式解 ...

  4. EKF优化:协方差coff计算公式、意义、Code优化

    复习!复习! 原文链接:http://blog.csdn.net/goodshot/article/details/8611178 1.代码: Matlab相关系数的意义: Eigen::Matrix ...

  5. 创建一个类Person

    创建一个类Person,包含以下属性:姓名(name).年龄(age).朋友(friends数组).问候(sayhi方法,输出问候语,例如:"你好!").交朋友(addFriend ...

  6. (转)Jetty实战之 安装 运行 部署

    http://blog.csdn.net/kongxx/article/details/7218767 本文地址:http://blog.csdn.NET/kongxx/article/details ...

  7. vs2008 打开项目 无法读取项目文件

    卸载vs2015之后 出现问题 C:\Windows\SysWOW64\regedit.exe 64系统运行这个 删除 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MS ...

  8. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战需求分析1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain—创建窗体 ​ BallJPanel—画小 ...

  9. BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板 贪心 + 堆 + 反向思考

    Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...

  10. 纯CSS 3D翻转一个面(翻转导航菜单 立方体)

    在做练习的时候学到css的翻转导航菜单,原代码有点让人头疼,通过对其css的参数一点点研究了其实现过程. 这里推荐大家研究这个3D翻转动画的代码. 我的github:swarz,欢迎给老弟我++星星 ...