Android 四大组件学习之ContentProvider二
上节学习了什么是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二的更多相关文章
- Android 四大组件学习之ContentProvider五
上几节学习了ContentProvider的实际用途,读取短信.插入短信,读取联系人.插入联系人等. 本节课在学习ContentProvider的观察者. 在生活中有第三方的软件.比方什么短信软件.此 ...
- Android 四大组件学习之ContentProvider三
上节课学习怎样自己创建一个ContentProvider.以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的 ...
- Android 四大组件学习之ContentProvider四
上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. wa ...
- Android 四大组件学习之BroadcastReceiver二
上节学习了怎样创建一个广播.也尝试接受系统打电话的广播. 本节课学习怎样自己定义广播.自己定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就開始行动吧. 先创建一个发送广播的应用 ...
- android四大组件学习总结以及各个组件示例(1)
android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...
- Android 四大组件之 Activity(二)
1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...
- Android 四大组件学习之Server一
上次学习了Android四大组件Activity之后,我们深刻理解了Activity.这次我们学习四大组件Service. Service与Activity的级别是一样的,都是Android系统不可缺 ...
- Android 四大组件学习之BroadcastReceiver一
本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比方在现实社会中,曾经每一个人家都有一台收音机,这可就能够去接受广播发出来的消息.大家都知道.程序世界也是參照的显示生活设 ...
- Android四大组件之一:ContentProvider(内容提供者)
Android中还提供了名为ContentProvider(内容提供者),可以向其他应用提供数据,但不常用,除非是同一公司开发的App,可以向不同应用提供数据.虽然为Android的四大组件之一,但用 ...
随机推荐
- Django html页面 'ascii' codec can't encode characters in position 8-10: ordinal not
用Django开发的页面,之前用的是python3.X,后来又换成python2.X后各种报错,编码问题,于是在所有python文件开头加了编码:#coding=utf-8 但是后来发现,有些文件加了 ...
- RabbitMQ 官方NET教程(二)【工作队列】
这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务和避免必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送 ...
- SQL Server对数据进行添加
下面介绍一下SQL Server如何往数据库中加入数据. <!-- 添加主人信息 --> <form action="add_Admin.jsp" method= ...
- GrepWin:Win7下的文本替换工具
工作环境退回到Win7之后,内容查找功能非常不给力,推荐一个文本内容查找工具grepWin. Win7下的文本查找/替换工具: grepWin
- 使用OpenCV画折线图
使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...
- (转)Openlayers 2.X加载高德地图
http://blog.csdn.net/gisshixisheng/article/details/44853881 概述: 前面的有篇文章介绍了Openlayers 2.X下加载天地图,本节介绍O ...
- tomcat映射java目录 sever.xml
<Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> & ...
- 记录:Ubuntu下安装SQL Developer
安装JDK. 用的Ubuntu18.04,已经自带JDK了. 下载SQL Developer. 官网链接:http://www.oracle.com/technetwork/developer-too ...
- es5、es6函数调用
ES5中函数的4种调用 在ES5中函数内容的this指向和调用方法有关 1 函数调用模式 包括函数名()和匿名函数调用,this指向window function getSum() { console ...
- C语言开发框架、printf(day02)
C语言里包含以.c作为扩展名的文件,这种 文件叫源文件.C语言程序的绝大部分内容 应该记录在源文件里. C语言里还包括以.h作为扩展名的文件,这种 文件叫头文件. C语言程序里可以直接使用数字和加减乘 ...