上节学习了什么是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. Django html页面 'ascii' codec can't encode characters in position 8-10: ordinal not

    用Django开发的页面,之前用的是python3.X,后来又换成python2.X后各种报错,编码问题,于是在所有python文件开头加了编码:#coding=utf-8 但是后来发现,有些文件加了 ...

  2. RabbitMQ 官方NET教程(二)【工作队列】

    这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务和避免必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送 ...

  3. SQL Server对数据进行添加

    下面介绍一下SQL Server如何往数据库中加入数据. <!-- 添加主人信息 --> <form action="add_Admin.jsp" method= ...

  4. GrepWin:Win7下的文本替换工具

    工作环境退回到Win7之后,内容查找功能非常不给力,推荐一个文本内容查找工具grepWin. Win7下的文本查找/替换工具: grepWin

  5. 使用OpenCV画折线图

    使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...

  6. (转)Openlayers 2.X加载高德地图

    http://blog.csdn.net/gisshixisheng/article/details/44853881 概述: 前面的有篇文章介绍了Openlayers 2.X下加载天地图,本节介绍O ...

  7. tomcat映射java目录 sever.xml

    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />        --> & ...

  8. 记录:Ubuntu下安装SQL Developer

    安装JDK. 用的Ubuntu18.04,已经自带JDK了. 下载SQL Developer. 官网链接:http://www.oracle.com/technetwork/developer-too ...

  9. es5、es6函数调用

    ES5中函数的4种调用 在ES5中函数内容的this指向和调用方法有关 1 函数调用模式 包括函数名()和匿名函数调用,this指向window function getSum() { console ...

  10. C语言开发框架、printf(day02)

    C语言里包含以.c作为扩展名的文件,这种 文件叫源文件.C语言程序的绝大部分内容 应该记录在源文件里. C语言里还包括以.h作为扩展名的文件,这种 文件叫头文件. C语言程序里可以直接使用数字和加减乘 ...