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 (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
随机推荐
- 笨方法学python--提问
1 实现 用户在终端进行输入 的方法 print "how old are you?", age = raw_input() 该地方,第1名后面加逗号,然后必须换行 2 若要限制用 ...
- iOS 判断数组不为空
if (array != nil && ![array isKindOfClass:[NSNull class]] && array.count != 0)
- Struts2中的验证框架
通过注解的方式,可以让方法不用验证 @SkipValidation public String toRegView() { System.out.println("toRegView&quo ...
- Android图片处理神器BitmapFun源码分析
作为一名Android开发人员,相信大家对图片OOM的问题已经耳熟能详了,关于图片缓存和解决OOM的开源项目也是相当的多,被大家熟知的就是Universal_image_loader和Volley了, ...
- lucene索引合并与增量索引
利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率.当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中.为了解决这个问题, Lucene ...
- Java8学习笔记----Lambda表达式 (转)
Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...
- update set from where
原文链接:http://blog.csdn.net/xcbsdu/article/details/6736503 关于update set from where 下面是这样一个例子: 两个表a.b,想 ...
- CD冷却效果实现
在NGUI中实现CD转圈的特效,可以用图片控件中UISprite组件的Fill Amount属性去控制. 在上图中skill表示需要冷却技能的图片:其子控件Label表示右下角的快捷键“Y”:子控件S ...
- The Accumulation of Capital
The Accumulation of Capital ---- by *Adam Smith Capitals are increased by parsimony, and diminished ...
- SlidingMenu的使用,结合Fragment(eclipse环境)
首先下载SlidingMenu,有Library和Sample,然后在自己的项目中引入类库(引入智慧北京工作空间的Library),然后V4包会发生冲突,删掉自己项目Libs目录下的V4包即可 侧滑布 ...