android四大组件之ContentProvider(二)

时间:2022-08-28 11:40:47

ContentProvider学习笔记

  上一章节我们编写了自定义的一个StudentProvider,他提供了两种供外界访问数据的方式,content://come.demo.sqlite.studentprovider/t_student和content://come.demo.sqlite.studentprovider/t_student/#,这一章我们将讲解其他应用程序将如何来访问StudentProvider中的数据。

1、ContentResolver类介绍

  我们知道StudentProvider继承了ContentProvider类,并实现了insert(),update(),delete(),query(),getType()等方法,同样的ContentResolver这个类也提供了insert(),update(),delete(),query()方法,当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法

  ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
    public Uri insert(Uri uri, ContentValues values):该方法用于往ContentProvider添加数据。
    public int delete(Uri uri, String selection, String[] selectionArgs):该方法用于从ContentProvider删除数据。
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于更新ContentProvider中的数据。
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于从ContentProvider中获取数据。

2、实例:对数据库表t_student的增删改查操作

(1)布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/btnAdd1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="插入数据1"
/> <Button
android:id="@+id/btnAdd2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="插入数据2"
/> <Button
android:id="@+id/btnSearch1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查询数据1"
/> <Button
android:id="@+id/btnSearch2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查询数据2"
/> <Button
android:id="@+id/btnUpdate1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="修改数据1"
/> <Button
android:id="@+id/btnUpdate2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="修改数据2"
/> <Button
android:id="@+id/btnDelete1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="删除数据1"
/> <Button
android:id="@+id/btnDelete2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="删除数据2"
/> </LinearLayout>

(2)MainActivity来实现具体的操作

package com.demo.contentprovider;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; /**
* 使用ContentResolver实现对数据库表t_student的操作
* @author yinbenyang
*/
public class MainActivity extends Activity { private Button btnAdd1, btnAdd2, btnSearch1, btnSearch2, btnUpdate1,
btnUpdate2, btnDelete1, btnDelete2; //匹配content://come.demo.sqlite.studentprovider/t_student路径
private static final int ONE = 1;
//匹配content://come.demo.sqlite.studentprovider/t_student/
private static final int TWO = 2;
//日志输出
private static final String TAG = "ContentProvider";
//定义的一个Uri,这个是StudentProvider提供的一个内容提供者
private static String CONTENT_URI = "content://come.demo.sqlite.studentprovider/t_student"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnAdd1 = (Button) findViewById(R.id.btnAdd1);
btnAdd2 = (Button) findViewById(R.id.btnAdd2);
btnUpdate1 = (Button) findViewById(R.id.btnUpdate1);
btnUpdate2 = (Button) findViewById(R.id.btnUpdate2);
btnSearch1 = (Button) findViewById(R.id.btnSearch1);
btnSearch2 = (Button) findViewById(R.id.btnSearch2);
btnDelete1 = (Button) findViewById(R.id.btnDelete1);
btnDelete2 = (Button) findViewById(R.id.btnDelete2); btnAdd1.setOnClickListener(listener);
btnAdd2.setOnClickListener(listener);
btnUpdate1.setOnClickListener(listener);
btnUpdate2.setOnClickListener(listener);
btnSearch1.setOnClickListener(listener);
btnSearch2.setOnClickListener(listener);
btnDelete1.setOnClickListener(listener);
btnDelete2.setOnClickListener(listener);
} private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnAdd1:
add(ONE);
break;
case R.id.btnAdd2:
add(TWO);
break;
case R.id.btnUpdate1:
update(ONE);
break;
case R.id.btnUpdate2:
update(TWO);
break;
case R.id.btnDelete1:
delete(ONE);
break;
case R.id.btnDelete2:
delete(TWO);
break;
case R.id.btnSearch1:
search(ONE);
break;
case R.id.btnSearch2:
search(TWO);
break;
default:
break;
}
}
}; // 查询数据
private void search(int type) {
ContentResolver resolver = getContentResolver();
Uri url = null;
// 指定查询的列名
String projection[] = new String[] { "sid", "sname", "age" };
// 查询的条件
String selection = "";
// 查询条件的参数值
String[] selectionArgs = null;
// 指定是否排序以及使用排序是时的排序规则
String sortOrder = "";
// 查询结果为一个Cursor
Cursor cursor = null;
switch (type) {
case ONE:
// parse方法通过传入一个字符串来构造一个Uri对象
url = Uri.parse(CONTENT_URI);
selection = "sid < ?";
selectionArgs = new String[] { "3" };
cursor = resolver.query(url, projection, selection, selectionArgs,
sortOrder);
while (cursor.moveToNext()) {
Log.i(TAG,
"sid=" + cursor.getInt(0) + ",sname="
+ cursor.getString(1) + ",age="
+ cursor.getShort(2));
Toast.makeText(
this,
"sid=" + cursor.getInt(0) + ",sname="
+ cursor.getString(1) + ",age="
+ cursor.getShort(2), Toast.LENGTH_SHORT)
.show();
}
break;
case TWO:
// 此时指定查询id为1的学生信息
url = ContentUris.withAppendedId(Uri.parse(CONTENT_URI),1);
selection = null;
cursor = resolver.query(url, projection, selection, selectionArgs,
sortOrder);
while (cursor.moveToNext()) {
Log.i(TAG,
"sid=" + cursor.getInt(0) + ",sname="
+ cursor.getString(1) + ",age="
+ cursor.getShort(2));
Toast.makeText(
this,
"sid=" + cursor.getInt(0) + ",sname="
+ cursor.getString(1) + ",age="
+ cursor.getShort(2), Toast.LENGTH_SHORT)
.show();
}
break;
default:
break;
}
} // 删除数据
private void delete(int type) {
ContentResolver resolver = getContentResolver();
Uri url = null;
String where = "";
String[] selectionArgs = null;
switch (type) {
case ONE:
url = Uri.parse(CONTENT_URI);
// 指定删除id为1,2的学生信息
where = "sid in(?,?)";
selectionArgs = new String[] { "1", "2" };
resolver.delete(url, where, selectionArgs);
break;
case TWO:
// 指定删除id为3的学生信息
url = ContentUris.withAppendedId(Uri.parse(CONTENT_URI),3);
Log.i(TAG, "url:" + url);
where = null;
resolver.delete(url, where, selectionArgs);
break;
default:
break;
}
} // 修改数据
private void update(int type) {
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
Uri url = null;
String where = "";
String[] selectionArgs = null;
switch (type) {
case ONE:
url = Uri.parse(CONTENT_URI);
values.put("sname", "update1");
values.put("age", 22);
where = "sid = ?"; // 指定更新语句的条件(此时若不指定则是更新全部的数据)
selectionArgs = new String[] { "1" }; // 指定占位符的数值
Log.i(TAG, resolver.update(url, values, where, selectionArgs) + "");
break;
case TWO:
// 此时的Uri中包含了需要更新数据的id,所以不再需要指定更新语句的条件和参数值
url = ContentUris.withAppendedId(Uri.parse(CONTENT_URI),2);
values.put("sname", "update2");
values.put("age", 22);
where = null;
Log.i(TAG, resolver.update(url, values, where, selectionArgs) + "");
break;
default:
break;
}
} // 插入数据
private void add(int type) {
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("sname", "zhaobenshan");
values.put("age", 23);
Uri url = null;
switch (type) {
case ONE:
url = Uri.parse(CONTENT_URI);
// insert()方法返回一个Uri对象,这个对象是新插入的数据的Uri
Log.i(TAG, resolver.insert(url, values).toString());
break;
case TWO:
/**
* 这个构造一个Uri为:content://com.demo.contentprovider.studentprovider/
* t_student/1,然后插入,实际上新插入的一条数据的id并不会为1,
* 因为已经存在为1的数据了,所以这个和上面的写法一样,生成的数据的id为2
*/
url = ContentUris.withAppendedId(Uri.parse(CONTENT_URI),1);
// insert()方法返回一个Uri对象,这个对象是新插入的数据的Uri
Log.i(TAG, resolver.insert(url, values).toString());
break;
default:
break;
}
}
}

页面显示的布局效果:

android四大组件之ContentProvider(二)

而后我们还是利用命令去com.demo.sqlite.activity/database/data.db中查看t_student表

(1) 点击插入数据1或者插入数据2,查看数据:

android四大组件之ContentProvider(二)

(2)点击查询数据1,可以看到弹出了id为1和2的两条数据,点击查询数据2可以看到只弹出id为1的数据

(3)点击修改数据1将t_student表中sid为1的name改为update1,age改为22,点击修改数据2将sid为2的name改为update2,age改为22.

android四大组件之ContentProvider(二)

(4)点击删除数据1将id为1,2的学生信息删除:如图删除后只剩下id为3的学生信息

android四大组件之ContentProvider(二)

  点击删除数据2将id为3的学生信息删除,如图,最后t_student表中已经没有学生信息了

android四大组件之ContentProvider(二)

后记:t_student表是SqliteDemo应用程序中的表数据,而现在通过ContentProviderDemo程序也可以实现对t_student表的操作,由此可见,我们的ContentProvider实现数据在应用程序间的共享了

android四大组件之ContentProvider(二)的更多相关文章

  1. Android 四大组件之&quot&semi; ContentProvider &quot&semi;

    前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...

  2. 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider

    数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...

  3. Android四大组件之——ContentProvider(一)

    Android四大组件之--ContentProvider(一) 本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblog ...

  4. 初学android&colon;四大组件之contentprovider

    一.ContentProvider的概念ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见的一些数据提供了默认的ContentP ...

  5. android四大组件之ContentProvider(一)

    ContentProvider学习笔记 1. ContentProvider基本概念 ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,虽然采用文件和SharedPref ...

  6. Android四大组件之contentProvider

    Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...

  7. Android四大组件之ContentProvider(二)读取设备上的图片、音频和视频

    Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,通过Content Provider的方式提供给用户.当设备开机或者有SD卡插拔等事件发生时, ...

  8. Android四大组件之——ContentProvider(二)

    Content Resolver介绍: 开发者文档中这么定义的: This class provides applications access to the content model. 这个类为应 ...

  9. Android 四大组件之四&lpar;ContentProvider&rpar;

    ContentProvider调用关系: ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法. ContentProvider可以指定需要共 ...

随机推荐

  1. CSS3的新属性的一下总结

    阮一峰:http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html 由于自己经常搞混:animation,tran ...

  2. java中String byte HexString的转换

    原文:http://blog.sina.com.cn/s/blog_62e9ec530101ebv6.html HexString——>byte public static byte[] hex ...

  3. 解决Oracle 11g在用EXP导出时,空表不能导出

    实践结论可行,看"2.解决办法" 一.问题原因:     11G中有个新特性,当表无数据时,不分配segment,以节省空间     1.insert一行,再rollback就产生 ...

  4. Android Metro风格的Launcher开发系列第一篇

    前言:从毕业到现在已经三年多了,回忆一下这三年基本上没有写过博客,总是觉得忙,没时间写,也觉得写博客没什么大用.但是看到很多大牛们都在写博客,分享自己的东西,所以嘛本着向大牛看齐,分享第一,记录第二的 ...

  5. mac下进行配置android真机调试环境

    学习android开发几天了,今天好不容易找了个android手机,直接连接mac电脑,结果eclipse-DDMS里面没有显示任何设备. 使用命令行adb devices 试了下,没设备列表. 郁闷 ...

  6. android jni ndk 视频分享

    链接如下:http://download.csdn.net/detail/jltxgcy/5667327.

  7. hdu 3006&Tab; The Number of set

    二进制的状态压缩.比如A集合里面有{1,5,7}那么就表示为1010001.B集合有{3,4},二进制表示1100.A|B=1011101. 按照这样的思路 可以用01背包 把所有的组合全部求出来. ...

  8. iOS开发The Operation couldn&&num;39&semi;t be completed&period;&lpar;LaunchServicesError error 0&period;&rpar;的解决方法

    显示错误:The Operation couldn't be completed.(LaunchServicesError error 0.)解决办法:第1种方法.点击当前的模拟器,点击IOS Sim ...

  9. lucene3&period;6&period;1 经典案例 入门教程 (包含从文件中读取content)

    转载http://liqita.iteye.com/blog/1676664 第一步:下载lucene的核心包 lucene-core-3.6.1-javadoc.jar (3.5 MB) lucen ...

  10. 基于IntelliJ IDEA开发工具搭建SSM框架并实现页面登录功能详细讲解二

    接: 接下来配置类 UserController package com.chatRotbot.controller; import com.chatRotbot.model.User; import ...