四大天王之内容提供者ContentProvider
来源:互联网 发布:java encodeuri 编码 编辑:程序博客网 时间:2024/04/27 16:09
大家好,给大家带来的是四大组件之一ContentProvider内容提供者,ContentProvide简单的解释是一个平台,用于放数据等一些可传递的东西,然后接受者根据自己的需要去这个平台拿数据,实现了共享数据的作用。我等下把数据库里的数据放在内容提供者这平台,然后去取数据,这样的一个demo.
步骤一:创建bookProvider继承contentProvide类
//定义数据库变量
public static final String TABLE = "t_book";
public static final String ID = "_id";
public static final String NAME = "name";
public static final String PRICE = "price";
private static final String AUTHORITS = "com.example.demo0819_sqlite.provider.bookprovider";
private static final int MULTIE = 1;
private static final int SINGLE = 2;
public SqliteHelper dbHelper;
// 配置uri匹配对象
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
// 集合,多行
// uri1: content:cn.it.sqlite.bookprovider/book
uriMatcher.addURI(AUTHORITS, "book", MULTIE);
// 单行
// uri2: content:cn.it.sqlite.bookprovider/book/6
uriMatcher.addURI(AUTHORITS, "book/#", SINGLE);
}
// 主要是初始化值
public boolean onCreate() {
dbHelper = new SqliteHelper(getContext());
return false;
}
// 查询
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//写入数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
int matchCode = uriMatcher.match(uri);
// 判断集合或者单行
switch (matchCode) {
// uri1: content:cn.it.sqlite.bookprovider/book
case MULTIE:
return db.query(TABLE, projection, selection, selectionArgs, null,
null, sortOrder);
case SINGLE:
// 获取uri后缀值,这里的后缀值是6
long parseId = ContentUris.parseId(uri);
// uri2: content:cn.it.sqlite.bookprovider/book/6
if (!TextUtils.isEmpty(selection)) {
selection = selection + " and " + ID + "=" + parseId;
} else {
selection = ID + "=" + parseId;
}
return db.query(TABLE, projection, selection, selectionArgs, null,
null, sortOrder);
default:
db.close();
throw new IllegalArgumentException("uri 不合法");
}
}
@Override
public String getType(Uri uri) {
return null;
}
// 添加
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int matchCode = uriMatcher.match(uri);
// 判断集合
switch (matchCode) {
// 判断集合,多行
case MULTIE:
long id = db.insert(TABLE, null, values);
return ContentUris.withAppendedId(uri, id);
//为什么不用判断当行,因为添加数据id是自动增长的,不用判断也可以
default:
db.close();
throw new IllegalArgumentException("uri 不合法");
}
}
// 删除
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int effectNum = 0;// 影响行数
int matchCode = uriMatcher.match(uri);
// 判断集合或者单行
switch (matchCode) {
case MULTIE:
// 查询数据 select * from t_book where id=6;
effectNum = db.delete(TABLE, selection, selectionArgs);
break;
case SINGLE:
// 获取uri后缀值,这里的后缀值是6
long parseId = ContentUris.parseId(uri);
if (!TextUtils.isEmpty(selection)) {
selection = selection + " and " + ID + "=" + parseId;
} else {
selection = ID + "=" + parseId;
}
effectNum = db.delete(TABLE, selection, selectionArgs);
break;
default:
db.close();
throw new IllegalArgumentException("uri 不合法");
}
return effectNum;
}
// 更新
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int effectNum = 0;// 影响行数
int matchCode = uriMatcher.match(uri);
// 判断集合或者单行
switch (matchCode) {
case MULTIE:
effectNum = db.update(TABLE, values, selection, selectionArgs);
break;
case SINGLE:
// 获取uri后缀值,这里的后缀值是6
long parseId = ContentUris.parseId(uri);
if (!TextUtils.isEmpty(selection)) {
selection = selection + " and " + ID + "=" + parseId;
} else {
selection = ID + "=" + parseId;
}
effectNum = db.update(TABLE, values, selection, selectionArgs);
break;
default:
db.close();
throw new IllegalArgumentException("uri 不合法");
}
return effectNum;
}
}
步骤三:创建一个测试类TestProvider继承AndroidTestCase
/**
* 测试内容提供者的测试类
测试类的使用方法
run as--->android Junit test
*/
public class TestProvider extends AndroidTestCase {
// uri地址 content://标记/数据库名
public static final String URI_STR = "content://com.example.demo0819_sqlite.provider.bookprovider/book";
public static final String TABLE = "t_book";
public static final String ID = "_id";
public static final String NAME = "name";
public static final String PRICE = "price";
// 查询
public void testQueryProvider() {
// 访问者,访问内容提供者。得到共享数据的作用
ContentResolver contentResolver = getContext().getContentResolver();
// 访问者查询,Uri.parse(URI_STR)解析uri
Cursor c = contentResolver.query(Uri.parse(URI_STR), null, null, null,
null);
// 游标遍历
while (c.moveToNext()) {
System.out.println(c.getInt(c.getColumnIndex("_id")));
System.out.println(c.getString(c.getColumnIndex("name")));
System.out.println(c.getInt(c.getColumnIndex("price")));
}
}
// 保存
public void testSaveProvider() {
ContentValues values = new ContentValues();
// 访问者
ContentResolver contentResolver = getContext().getContentResolver();
values.put("_id", 128);
values.put("name", "水浒传");
values.put("price", 70);
contentResolver.insert(Uri.parse(URI_STR), values);
}
// 删除
public void testDeleteProvider() {
// 访问者
ContentResolver contentResolver = getContext().getContentResolver();
// 访问者删除
int delete = contentResolver
.delete(Uri.parse(URI_STR), " _id=75", null);
}
// 更新
public void testUpdateProvider() {
ContentResolver contentResolver = getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("_id", 126);
values.put("name", "大话西游3");
contentResolver.update(Uri.parse(URI_STR), values, " _id=126", null);
}
// 电话联系人
// - Uri:content://call_log/calls :通话记录
// 字段:_id、number、date、duration
public void testCall() {
String uri = "content://call_log/calls";
ContentResolver contentResolver = getContext().getContentResolver();
Cursor c = contentResolver
.query(Uri.parse(uri), null, null, null, null);
while (c.moveToNext()) {
System.out.print(c.getString(c.getColumnIndex("number")) + " ");
System.out.print(c.getString(c.getColumnIndex("date")) + " ");
System.out.print(c.getString(c.getColumnIndex("duration")) + " ");
}
}
}
注意事项:要在androidManifest.xml注册,权限。
//通话记录的权限
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
//测试的注册
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.demo0819_sqlite" >
</instrumentation>
//内容提供者的权限。注册标记,android:authorities
<provider
android:name="com.example.demo0819_sqlite.provider.bookProvider"
android:authorities="com.example.demo0819_sqlite.provider.bookprovider"
android:enabled="true" >
</provider>
//测试使用的包
<uses-library android:name="android.test.runner" />
好了,今天就到这了,小编了,要好好休息了,奋斗不止,晚安。
- 四大天王之内容提供者ContentProvider
- Android四大组件之内容提供者--ContentProvider
- Android四大组件之内容提供者ContentProvider
- 四大组件之内容提供者ContentProvider
- Android四大组件之内容提供者--ContentProvider
- android四大组件之内容提供者(ContentProvider)
- Android四大组件之一之内容提供者ContentProvider
- android 四大应用主键之 --- ContentProvider (内容提供者)
- Android四大组件之ContentProvider(内容提供者)01
- Android四大组件之ContentProvider(内容提供者)02
- 四大组件之内容提供者——ContentProvider
- Android四大组件之一ContentProvider(内容提供者)
- android四大组件之一内容提供者contentprovider
- Android四大组件ContentProvider 内容提供者
- 四大组件 — ContentProvider 内容提供者
- 四大组件之内容提供者
- 数据存储详解(四)及四大组件之一 之--->ContentProvider(内容提供者)
- Android之四大组件之一-ContentProvider内容提供者的使用(二)
- 【php】自动加载类autoload psr-0与psr-4标准
- hdu 4059 The Boss on Mars 容斥原理 数列通项公式
- Oracle OCP笔记(28)RMAN备份 - Catalog
- 认识GIT
- 1 时间序列基本概念
- 四大天王之内容提供者ContentProvider
- hdu 3388 Coprime 容斥原理 二分查找
- UVa 1623:Enter the Dragon(贪心)
- OnTouchListener触摸事件
- java内存映射
- [MFC] MDI框架下 vs2010 动态添加菜单
- JDK安装与环境变量配置
- 一些简单排序算法的下界
- 扩展方法