上节学习了什么是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. BZOJ 1511 KMP

    题意:求出每个前缀的最长周期之和(等于本身的算0) 思路: 求出来next数组  建出next树 找到不为0的最小的 n减去它就是答案 //By SiriusRen #include <cstd ...

  2. php解析 html类库 simple_html_dom

    如果从字符串加载html文档,需要先从网络上下载.建议使用cURL来抓取html文档并加载DOM中. 查找html元素 可以使用find函数来查找html文档中的元素.返回的结果是一个包含了对象的数组 ...

  3. ACM_写数字

    写数字 Time Limit: 2000/1000ms (Java/Others) Problem Description: 把由1开始的自然数依次写下来:123456789101112……,重新分组 ...

  4. 网上干货 ElasticSearch详解与优化设计

    https://blog.csdn.net/joez/article/details/52171199?locationNum=3&fps=1 分析得很好,需要仔细阅读 问题遗留点: Fiel ...

  5. 【java基础】(2)Java父类与子类的 内存引用讲解

    从对象的内存角度来理解试试.假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.现在通过代码来看看内存的分配情况:Father f = ...

  6. java基础学习四

    一.java中的基本数据类型 二.double和float精度不准的问题 double和float本身确实存在某种缺陷,不能用于精确计算. 解决办法: 用java.math.BigDecimal,通过 ...

  7. 设计模式之合成模式(Java语言描述)

    <JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树结构中,可以 ...

  8. 《java数据结构与算法》系列之“快速排序"

    部门没人了,公司动作好快...算了,不想了!还是学知识吧,只有它不会让自己失望. 继续我的算法学习,快速排序是应用很广的算法,看了一早上才看懂些,感觉比冒泡之类的难理解,可能主要是递归那块自己不是很理 ...

  9. 【Oracle】Rman备份策略

    1. 查看可设置参数 RMAN> show all; RMAN configuration parameters for database with db_unique_name DRZ are ...

  10. MSP430之section(1)

    1 Intro The smallest unit of an object file is a section. A section is a block of code or data that ...