ContentProvider示例
http://hi.baidu.com/pekdou/item/b2a070c37552af210831c678
首先,我自己是各初学者,网上一些关于ContentProvider的例子也不少,我自己试了很多,但总是有问题,终于今天哥自己写了个出来,自己摸索着写真是太累了。
首先说个查询一条记录的toy demo:
ContentProviderExample(Project name)
|_src
| |_com.motorola.snow.toy
| |_ContentProviderExample.java
| |_DataProvider.java
|_res
| |_layout
| | |_main.xml
| |_values
| |_drawable
|
|_AndroidManifest.xml
(这是工程的目录,要写这么详细是因为:我看的几个文档都是在讲怎样怎样,没有一个图示。有时候我都不能分辨)
下面一一介绍每个文件需要写写什么东西:
ContentProviderExample.java
package com.motorola.snow.toy;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
public class ContentProviderExample extends Activity {
// public static final String AUTHORITY = "com.motorola.snow";
public static final Uri CONTENT_URI = Uri
.parse("content://com.motorola.snow/students");
private static final String[] PROJECTION = new String[] { "stu_no",
"stu_name" };
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.showOne);
Cursor c = getContentResolver().query(CONTENT_URI, PROJECTION,
"stu_no = ?", new String[] { "S1001" }, null);
c.moveToFirst();
tv.setText(c.getString(1));
}
}
DataProvider.java
package com.motorola.snow.toy;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;
public class DataProvider extends ContentProvider {
private static final String DATABASE_NAME = "stu_database";
private static final int VERSION = 1;
private static final String TABLE_NAME = "students";
private DataBaseHelper helper;
private class DataBaseHelper extends SQLiteOpenHelper {
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE students (stu_no TEXT, stu_name TEXT)");
String sql1 = "insert into students (stu_no, stu_name) values ('S1001', 'Tom')";
String sql2 = "insert into students (stu_no, stu_name) values ('S1002', 'John')";
String sql3 = "insert into students (stu_no, stu_name) values ('S1003', 'Jack')";
try {
db.execSQL(sql1);
db.execSQL(sql2);
db.execSQL(sql3);
} catch (Exception e) {
e.printStackTrace();
Log.println(0, "insert error",
"Some error occur when create table");
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean onCreate() {
helper = new DataBaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query("students", projection, selection, selectionArgs, null, null,
null);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
main.xml
view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03. android:orientation="vertical"
04. android:layout_width="fill_parent"
05. android:layout_height="fill_parent"
06. >
07.<TextView
08. android:layout_width="fill_parent"
09. android:layout_height="wrap_content"
10. android:text="@string/hello"
11. />
12.
13.<TextView
14. android:id="@+id/showOne"
15. android:layout_width="fill_parent"
16. android:layout_height="wrap_content"
17. />
18.</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:id="@+id/showOne"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
AndroidManifest.xml
view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?>
02.<manifest xmlns:android="http://schemas.android.com/apk/res/android"
03. package="com.motorola.snow.toy"
04. android:versionCode="1"
05. android:versionName="1.0">
06. <application android:icon="@drawable/icon" android:label="@string/app_name">
07. <activity android:name=".ContentProviderExample"
08. android:label="@string/app_name">
09. <intent-filter>
10. <action android:name="android.intent.action.MAIN" />
11. <category android:name="android.intent.category.LAUNCHER" />
12. </intent-filter>
13. </activity>
14. <provider android:name="DataProvider"
15. android:authorities="com.motorola.snow" >
16. </provider>
17. </application>
18. <uses-sdk android:minSdkVersion="3" />
19.</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.motorola.snow.toy"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ContentProviderExample"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name="DataProvider"
android:authorities="com.motorola.snow" >
</provider>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
其中有几个是一直困扰我的问题,在这个工程中终于得到解决。还是比较高兴的:
1.
在AndroidManifest.xml文件中注册了
<provider android:name="DataProvider"
android:authorities="com.motorola.snow" >
</provider>
这句话告诉工程,我在这个工程下定义了一个ContentProvider,名字叫DataProvider(这个类大家看到,其实就是ContentProvider的一个自定义的子类) authorities 定义的字符串实际上在ContentProviderExample.java中定义Uri时做的唯一标示符而已,一般我喜欢跟包同名,不过需要注意的是,这个字符串必须全部为小写!!
2.
DataProvider.java实际上是我自己定义的ContentProvider的一个子类,需要重写其继承下来的方法:我只是实现了一个查询功能,但实现了其中的一个功能,其他CRUD的操作应该不难。在这个类里定义了一个内部类:DatabaseHelper extends SQLiteOpenHelper (一开始看的哪个文档也是这样写,可是在eclipse中总是报错,后来才知道必须要重写它的构造方法,这个构造方法的主要作用就是新建数据库,个人理解)实际上在下面DataProvider onCreate 方法中定义了一个DataBaseHelper的实例,在定义的时候他会自行调用DataBaseHelper的 onCreate 方法,创建数据库,因此我为了简单起见,建表并插入了几行数据。这主要要明白这子类中方法的调用顺序,一开始我也很难理解。
3.
说说ContentProviderExample这个类吧:首先定义了
public static final Uri CONTENT_URI = Uri
.parse("content://com.motorola.snow/students");
其实这是某种固定的写法:这个字符串必须以 content://开始,中间那段要和在AndroidManifest.xml文件中注册的一致,后面一般用的是数据库表名,其实这后面还有一截的是数字,我暂时还不太清楚这最后一段数字的用法,这个具体可以看一下developer.android文档;
下面定义了一个数组:
private static final String[] PROJECTION = new String[] { "stu_no",
"stu_name" };
这个数组定义的是:在查询中需要查询哪几列,这里我查询的是stu_no和stu_name 2列。
重点说一说下面这段:
Cursor c = getContentResolver().query(CONTENT_URI, PROJECTION,
"stu_no = ?", new String[] { "S1001" }, null);
c.moveToFirst();
tv.setText(c.getString(1));
首先getContentResolver()这个方法返回的是一个ContentProvider的实例,这个方法在所有 Activity中都可以被调用,.query()方法实际上查询的是在DataProvider中重写的query()方法,里面的几个参数分别是Uri,要查询的列,查询条件(where),用来填充查询语句中?号的值,最后是orderBy没有,所以为null,这些参数被传到DataProvider.query()方法中执行。Android会自己拼出一个查询字符串。需要注意的是“stu_no=?”查询条件前面是不需要加where的,android会自行添加。
NOTE:
需要理解的是为什么要定义Uri,我个人的理解:一个比较大的Android工程,可能会用到几个ContentProvider来存储数据,因此在AndroidManifest.xml中注册是需要有个唯一的标识符,不同的URi对应不同的ContentProvider,将Uri作为参数传到query()方法里,就指明了我现在要操作的数据库究竟是哪个
本文来自CSDN博客http://blog.csdn.net/tang_jiajia/archive/2010/03/24/5412164.aspx
ContentProvider示例的更多相关文章
- contentprovider的学习实例总结
工作中遇到了contentprovider数据共享机制,下面来总结一下: 一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数 ...
- SQLiteDatabase和Contentprovider
SQLiteDatabase和Contentprovider这两个数据库,我一般是用前面一个,喜欢它的操作数据库的语句,简单明了,可惜有时遇到数据库同步的问题,有时我们需要在一个数据库下建立多个表,多 ...
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
- Android学习(十二) ContentProvider
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据, ...
- 一起学Android之ContentProvider
本文主要讲解在Android开发中ContentProvider的常规用法,仅供学习分享使用,如有不足之处,还请指正. 访问一个ContentProvider 在Android开发中,应用程序通过Co ...
- Android内容提供者(Content provider)
使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访 ...
- android targetSdkVersion>=26收不到广播的处理
背景:GP新政策,要求Google Player上架应用的targetSdkVersion>=26. 一. 为啥GP要求targetSdkVersion>=26? 1 targetSdkV ...
- Android中的UriMatcher、ContentUrist和ContentResolver
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据.Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris .掌握它们的 ...
- Content Provider 详解
几个概念:Cursor. Content provider . Uri .contentresolver 1. Cursor : 个人理解为数据库中的一行数据,它是每行数据的集合.它是一个类.通过它 ...
随机推荐
- Android 生态消息推送平台介绍
一.手机厂商平台 华为消息推送服务 华为推送(Push)是为开发者提供的消息推送平台,建立了从云端到手机端的消息推送通道,使应用可以将最新信息及时通知用户,从而构筑良好的用户关系,提升用户的感知和活跃 ...
- 2019 Web开发学习路线图
以下 Web 开发人员学习路线图是来自 Github developer-roadmap 项目,目前已经有繁体版翻译 developer-roadmap-chinese. 主要有三个方向,分别为前端开 ...
- 3.Dubbo2.5.3快速启动Hello World
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.服务提供者 (1)工程目录 (2)接口代码 HelloService.java package cn.lj ...
- loli的混合算法测试
最近刚讲了最短路,说要考试我以为是考最短路,然而只有一道是最短路... 数据似乎有一点问题,不管了,反正手工测评都是对的,那现在就来看看题吧. Balanced:(此处并没有网址) 题意概述:$n$ ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
- kubernetes label 标签使用
查看node的标签kubectl get node --show-labels 删除标签kubectl label nodes node5 storagenode- 设置标签kubectl label ...
- Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-2-Compose 命令说明
Compose 命令说明 1)命令对象与格式 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中 的服务或者容器.如果没有特别的说明,命令对象将是项目,这意味着项目中所有 ...
- 使用docker-compose快速构建wordpress
前提必须是在docker的环境下,关于docker的安装可以参考(考虑目前国内使用ubuntu和centos的比较多,所以就列出这两个): Ubuntu16.04安装docker centos7之do ...
- 十分钟教你使用NoteExpress
http://www.a-site.cn/article/761794.html 如果你正走在读研的路上,不管是什么专业,日常生活中都少不了读文献.读文献和读文献. 与其等到文献堆积如山,给阅读和使用 ...
- Advanced Javascript outlining插件说明
Advanced Javascript outlining插件 用途:在js文件中写入#region/#endregion代码组合段,可收缩和展开.类似于后台页面的region用法. 效果截图如下(前 ...