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

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

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

public class MyContentProvider extends ContentProvider {

	@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stub
return 0;
} @Override
public String getType(Uri arg0) {
// TODO Auto-generated method stub
return null;
} @Override
public Uri insert(Uri arg0, ContentValues arg1) {
// TODO Auto-generated method stub
return null;
} @Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false;
} @Override
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
String arg4) {
// TODO Auto-generated method stub
return null;
} @Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
return 0;
}
}

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

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

public class MyDbOpenHelper extends SQLiteOpenHelper {

	public String TABLE_NAME="user";
public MyDbOpenHelper(Context context) {
super(context, "user.db", null, 1);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table user(_id integer primary key autoincrement, name char(10), age integer(2), salary integer(10))");
} @Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub }
}

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

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

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

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

既然一切都准备好了。

我们就插入一组数据:

Activity的OnCreate方法

public class MainActivity extends Activity {

    ContentResolver cResolver;
    //得到自定义的ContentProvider的url
    Uri uri=Uri.parse("content://com.ui.contentprovider/");
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*得到ContentResolver*/
        cResolver = getContentResolver();   
    }

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

    public void insert(View v)
{
Log.i("MainActivity", "---------insert");
ContentValues values = new ContentValues(); values.put("name", "张三");
values.put("age", 20);
values.put("salary", 13000);
cResolver.insert(uri, values); values.put("name", "李四");
values.put("age", 19);
values.put("salary", 10000);
cResolver.insert(uri, values); values.put("name", "王五");
values.put("age", 40);
values.put("salary", 200000);
cResolver.insert(uri, values); values.put("name", "朱八");
values.put("age", 10);
values.put("salary", 2000);
cResolver.insert(uri, values);
}

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

public class MyContentProvider extends ContentProvider {

	private MyDbOpenHelper dhHelper;
private SQLiteDatabase db; @Override
public boolean onCreate() {
Log.i("MyContentProvider", "onCreate"); //调用MyDbOpenHelper的onCreate方法创建数据库
dhHelper = new MyDbOpenHelper(getContext());
db = dhHelper.getWritableDatabase();
return false;
} //插入第三方应用的数据
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i("MyContentProvider", "insert");
db.insert(dhHelper.TABLE_NAME, null, values);
return uri;
}

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

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

Activity中当点击deletebutton后:

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

ContentProvider中的delete须要改为:

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

执行结果为:

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

加了500

activity当点击updatebutton运行的操作:

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

ContentProvider中改动为:

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

执行效果为:

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

Activity的代码:

    public void query(View v)
{
Cursor cursor = cResolver.query(uri, null, "salary >= ? ", new String[]{"10000"}, null);
Log.i("MainActivity", "---------query");
while(cursor.moveToNext())
{
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
int salary = cursor.getInt(cursor.getColumnIndex("salary"));
System.out.println(name + ";" + age + ";" + salary);
}
}

ContentProvider中的须要改动的代码:

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

串口的打印:

好, 关于自定义自己的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. D - Garden

    Problem description Luba thinks about watering her garden. The garden can be represented as a segmen ...

  2. Windows phone开发之文件夹与文件操作系列(一)文件夹与文件操作

    Windows phone7中文件的存储模式是独立的,即独立存储空间(IsolatedStorage).对文件夹与文件操作,需要借助IsolatedStorageFile类. IsolatedStor ...

  3. CruiseControl.NET 的安装与配置

    CC.NET 是 CruiseControl.NET 的简称,官方网站在这里. 官方的定义是自动连续集成服务, 使用Microsoft .NET Framework实现. 另外它还有Java的版本叫做 ...

  4. CSS的常用属性(二)

    盒子模型之边框 border-(top/bottom/left/right)-style: solid 边框的风格 如(solid 实线,dotted 点线,dashed 虚线) border-top ...

  5. 复习java基础第二天(异常处理)

    一.常见的异常类型: public class TestException { public static void main(String[] args) { int i = 10; //数学异常: ...

  6. 用SQL Server验证用户名和密码

    用SQL Server验证用户名和密码,从页面输入的用户名和密码与数据库的用户名和密码进行匹配,正确则登入,错误则提醒. <form action="index.jsp" m ...

  7. SLAM: Structure From Motion-移动中三维场景重建

    wiki链接:https://en.wikipedia.org/wiki/Structure_from_motion 三维重建: 三维物体建模总结 1. 视野内三维物体重建 : Kinect fusi ...

  8. MAMP PRO php的session保存在哪里

    session的概念就不介绍了,最近接触php,很好奇session会保存在哪里. mac上用了MAMP PRO集成环境,作为服务器. 查了网上,说session的保存路径在php.ini中声明,于是 ...

  9. python学习之小小爬虫

    学习python一段时间了,写了一个图片的小小爬虫,分享下,不喜勿喷! #coding=utf-8 ''' Created on 2015-5-22 @author: 悦文 ''' import re ...

  10. 【剑指Offer】1、二维数组中的查找

      题目描述:   在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...