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 (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
随机推荐
- ignite服务中的bean注入为空
在写ignite服务的时候,通常服务配置在启动文件中: <bean class="org.apache.ignite.services.ServiceConfiguration&quo ...
- Co-Debugging JNI with Android Studio and Visual Studio
Tutorials > Android > Integration with other tools > Co-Debugging JNI with Android Studio a ...
- android打成apk
用的软件是这个 D:\软件备份\adt-bundle-windows-x86_64-20140321\adt-bundle-windows-x86_64-20140321\eclipse file-- ...
- jQuery 数据滚动(上下)
setInterval(function() { jq('.sjbg02 li:first').animate({ 'height': '0', 'opacity': '0' }, 'slow', f ...
- java 工作内存
所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的.看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓 ...
- ZOJ 2866 Overstaffed Company
树状数组 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...
- Windows 2003】利用域&&组策略自动部署软件
Windows 2003]利用域&&组策略自动部署软件 转自 http://hi.baidu.com/qu6zhi/item/4c0fa100dc768613cc34ead0 ==== ...
- EM阅读资料
1,从最大似然到EM算法浅解 2,(EM算法)The EM Algorithm 3,数据挖掘十大算法----EM算法(最大期望算法) (番外)最大后验估计(MAP)
- Elkstack2.0部署
部署步骤如下: 1.1 资源拷贝 1 jdk1.8 2 kafka 3 kafka-manager 1.2 jvm 配置 vim /etc/profile.d/java.sh JAVA_HOME=/u ...
- spring MVC之返回JSON数据(Spring3.0 MVC)
方式一:使用ModelAndView的contentType是"application/json" 方式二:返回String的 contentType是&qu ...