Content Provider 小结
Android中的四大组件之一ContentProvider,它支持多个应用间进行存储和读取数据等操作,实现不同应用间的数据共享。
ContentProvider,解释为内容提供商。顾名思义,就是对外提供数据。其工作形式主要是ContentProvider以Uri的形式对外提供数据,允许其他应用访问或者修改数据,其他应用程序就使用ContentResolver根据ContentProvider提供的Uri去访问进行对数据的各种操作。
实现数据共享的步骤:
1,创建一个简单的数据库供ContentProvider进行操作。创建数据库方法:定义子类继承SQLiteOpenHelper,在onCreate()方法中申明SQL创建语句,用execSQL()创建。
2,定义一个子类继承ContentProvider,然后在主配置文件中对你申明的ContentProvider进行注册!必须要注册!
3,重写其中的各种方法,如getType(),insert(),delete(),update(),query()方法。,
在其子类中,我们要做的很重要的一件事就是进行Uri的配置,使其他应用可以通过ContentResolver根据其Uri进行操作。这里我们就要用到UriMatcher类,它主要有两个方法:
一个是addURI(String authority, String path, int code),它要做的就是添加Uri。authority表示其主配置文件中的注册授权,path表示要进行操作的表名,code是你自己定义的整数。
另一个是match(Uri uri),uri就是你所要操作的uri地址,它返回一个整数,就是你之前自己定义的code。
这两个方法就相当与加密和解码的功能。一个Uri就代表对特定数据的操作。
在进行解析Uri的时候,我们需要对Uri结尾处的数字(即你所要操作表的行的id),这时候就要用到ContentUris,它用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
一个是 withAppendedId(uri, id)用于为路径加上ID部分
另一个是parseId(uri)方法用于从路径中获取ID部分
4,通过Context的getContentResolver()方法实例化ContentResolver。根据ContentProvider所提供的Uri进行数据访问和操作。
以下是我的操作代码:
主配置文件注册ContentProvider
<provider android:name=".StudentProvider"
android:authorities="com.example.android_contentprovider.StudentProvider">
</provider>
主配置文件
定义了一个Tools工具类便于操作
package com.example.android_contentprovider;
import android.net.Uri;
public class Tools {
public static final int VERSION = 1;// 数据库版本号
public static final String DNAME = "student.db";// 数据库名称
public static final String TABLE_NAME = "student";// 表名
public static final String ID="id";
public static final String PEOPLE_NAME="name";
public static final String ADDRESS="address";
public static final String SEX="sex";
public static final int STUDENT=1;
public static final int STUDENTS=2;
public static final String AUTHORITY="com.example.android_contentprovider.StudentProvider";
public static final String ONLY="vnd.android.cursor.item/"+TABLE_NAME;
public static final String MULITY= "vnd.android.cursor.dir/"+TABLE_NAME;
public static final String URL="content://"+AUTHORITY+"/"+TABLE_NAME;
}
Tools.java
创建名为student的数据库
package com.example.android_contentprovider;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, Tools.DNAME, null, Tools.VERSION);
// TODO Auto-generated constructor stub
}
// 创建一个数据库
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "create table " + Tools.TABLE_NAME + " ( " + Tools.ID
+ " integer primary key autoincrement ," + Tools.PEOPLE_NAME
+ " varchar(64)," + Tools.ADDRESS + " varchar(64))";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
DbHelper.java
创建子类继承ContentProvider,进行配置。
package com.example.android_contentprovider;
import android.R.integer;
import android.R.string;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.CursorJoiner.Result;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.provider.ContactsContract.Contacts.Data;
import android.provider.SyncStateContract.Helpers;
import android.util.Log;
public class StudentProvider extends ContentProvider {
// 实例化
private DbHelper helper = null;
public static final UriMatcher pUriMatcher = new UriMatcher(
UriMatcher.NO_MATCH);
static {
pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME + "/#",
Tools.STUDENT);
pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME, Tools.STUDENTS);
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
helper = new DbHelper(getContext());
return false;
}
//进行查找操作
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Cursor cursor = null;
try {
SQLiteDatabase database = helper.getWritableDatabase();
int flag = pUriMatcher.match(uri);
switch (flag) {
case Tools.STUDENT:
long id = ContentUris.parseId(uri);
String where_values = " id = " + id;
if (selection != null && !selection.equals("")) {
where_values += " and " + selection;
}
cursor = database.query(Tools.TABLE_NAME, null, where_values,
selectionArgs, null, null, null);
break;
case Tools.STUDENTS:
cursor = database.query(Tools.TABLE_NAME, null, selection,
selectionArgs, null, null, null);
break;
}
} catch (Exception e) {
// TODO: handle exception
}
return cursor;
}
@Override
public String getType(Uri uri) {
// 得到匹配符
int flag = pUriMatcher.match(uri);
switch (flag) {
case Tools.STUDENT:
return Tools.ONLY;
case Tools.STUDENTS:
return Tools.MULITY;
default:
throw new IllegalArgumentException("Unknown URI" + uri);
}
}
// 进行插入操作
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
Uri resultUri = null;
int flag = pUriMatcher.match(uri);
switch (flag) {
case Tools.STUDENTS:
SQLiteDatabase database = null;
database = helper.getWritableDatabase();
// id表示插入当前行的行号
long id = database.insert(Tools.TABLE_NAME, null, values);
resultUri = ContentUris.withAppendedId(uri, id);
getContext().getContentResolver().notifyChange(resultUri, null);
break;
}
Log.i("StudentProvider", resultUri.toString());
return resultUri;
}
// 进行删除操作
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int resultId = -;
try {
SQLiteDatabase database = helper.getWritableDatabase();
int flag = pUriMatcher.match(uri);
switch (flag) {
case Tools.STUDENT:
long id = ContentUris.parseId(uri);
String where_values = "id= " + resultId;
if (selection != null && !selection.equals("")) {
where_values += " and " + selection;
}
resultId = database.delete(Tools.TABLE_NAME, where_values,
selectionArgs);
break;
case Tools.STUDENTS:
resultId = database.delete(Tools.TABLE_NAME, selection,
selectionArgs);
break;
}
} catch (Exception e) {
// TODO: handle exception
}
return resultId;
}
//进行修改更新
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int resultId = -;
try {
// update table set name=?,address=? where id=?
long id = ContentUris.parseId(uri);
int flag = pUriMatcher.match(uri);
SQLiteDatabase database = helper.getWritableDatabase();
switch (flag) {
case Tools.STUDENT:
String where_values = " id = " + id;
if (selection != null && !selection.equals("")) {
where_values += " and " + selection;
}
resultId = database.update(Tools.TABLE_NAME, values,
where_values, selectionArgs);
break;
}
} catch (Exception e) {
// TODO: handle exception
}
return resultId;
}
}
StudentProvider.java
这里我注册了一个instrumentation单元测试。
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.android_contentprovider">
</instrumentation>
定义MyTest测试类继承AndroidTestCase
package com.example.android_contentprovider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
public class MyTest extends AndroidTestCase {
public MyTest() {
// TODO Auto-generated constructor stub
}
public void insert() {
ContentResolver contentResolver = getContext().getContentResolver();
Uri url = Uri.parse(Tools.URL);
ContentValues values = new ContentValues();
values.put(Tools.PEOPLE_NAME, "王五");
values.put(Tools.ADDRESS, "北京");
contentResolver.insert(url, values);
}
public void delete() {
ContentResolver contentResolver = getContext().getContentResolver();
Uri uri = Uri.parse(Tools.URL + "/1");
contentResolver.delete(uri, null, null);
}
public void update() {
ContentResolver contentResolver = getContext().getContentResolver();
Uri uri = Uri.parse(Tools.URL + "/2");
ContentValues values = new ContentValues();
values.put(Tools.PEOPLE_NAME, "程洋");
values.put(Tools.ADDRESS, "上海");
contentResolver.update(uri, values, null, null);
}
public void query() {
ContentResolver contentResolver = getContext().getContentResolver();
Uri uri = Uri.parse(Tools.URL);
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
// 输出查询该条记录的名字
System.out
.println("你所查找的学生为:"
+ cursor.getString(cursor
.getColumnIndex(Tools.PEOPLE_NAME))
+ ";地址为:"
+ cursor.getString(cursor
.getColumnIndex(Tools.ADDRESS)));
}
}
}
MyTest.java
note:正学习Android之中,不足的地方还有很多望见谅。
Content Provider 小结的更多相关文章
- android学习十二(android的Content Provider(内容提供器)的使用)
文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中訪问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能 ...
- Android开发(7)数据库和Content Provider
问题聚焦: 思想:应用程序数据的共享 对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的 Content Provider提供了一个标准的接口,可供其他应用程序访问和使用其他程序的数据 下面我们 ...
- Android Content Provider Guides
Android Content Provider Guides Content Providers管理对结构化数据集的访问.它们包装数据,并且提供一种定义数据安全的机制. Content provid ...
- Android Content Provider基础
Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...
- Android 内容提供器(Content Provider)介绍
内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性.目前,使用内容 ...
- Android学习五:Content Provider 使用
1ContentProvider相关知识1.1在安卓应用中,通过文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreference ...
- 1.3 Content Provider
ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,分为系统的和自定义的,系统的也就是例如联系人,图片等数据. 使用方式:一个应用实现ContentProvider来提供内 ...
- Android应用安全之Content Provider安全
android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序.这些数据可以存储在文件系统.SQLite数据库中,或以任何其它合理的方式存储.其他应用可以通过C ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
随机推荐
- Win32 SDK Combo Box
如下图所示,显示了三种不同风格的Combo Box样式.当然,现在这样看不出第一种与第三种之间的区别,但是第二种与其他两种的区别是明显的,第二种的列表框始终是出于现实状态的. Combo Box: 一 ...
- C# tostring()汇总
原文:http://www.cnblogs.com/xiaopin/archive/2010/11/05/1870103.html C 货币 2.5.ToString("C") ¥ ...
- 初学.net 网页打开过程
一个网页打开的过程 1.进入控制器里的方法里 控制器的命名必须以Controll结尾前面的名字要和view层的命名一致 2.控制器完了以后 就进入view层对应的视图里 3.视图里调用model ...
- IIS访问PHP文件时,弹出用户名和密码提示框的解决方法
找了一圈,以下的方法解决了IIS访问PHP弹用户名和密码提示框问题. 解决方法:给PHP安装目录everyone读取权限 这样不知道会不会出现安全问题,请大家谨慎.
- PHP生成静态页面详解
PHP生成静态页面详解 看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考.好了,我们先回顾一些基本的概念. 一,PHP脚本与动态页面. PHP ...
- c++模板入门
最近使用了c++模板,觉得非常强大,只是写起来需要掌握一点技巧.大部分模板都是直接把定义写在.h头文件,并且有些人还说这样做的原因是模板不支持分编译,可是以前的编译器对模板的支持不够好吧,但是现在完全 ...
- Java中常见的5种WEB服务器介绍
这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...
- linux系统定时重启tomcat
#touch auto-start.sh [root@Linux opt]# echo $LANGen_US.UTF-8 #vim auto-start.sh #!/bin/sh export LAN ...
- sizeof和strlen
1.char *str="0123456789"; 这个变量是存在静态区域的,是delete不了的,是内存自动分配的,可以用strlen(str)得到其长度,不能用sizeof. ...
- java 工作内存
所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的.看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓 ...