Content Provider基础
1.Content Provider为存储和获取数据提供了统一的接口。
2.Content Provider可以在不同的应用程序之间共享数据。
3.Android为常见的一些数据提供了ContentProvider(包括音频,视频,图片和通讯录等)。
Manifest中加入:
<provider android:name="ycitss.cp.FirstContentProvider"
android:authorities="ycitss.cp.FirstContentProvider" />
DatabaseHelper.java:
package ycitss.sqlite3.db; import ycitss.cp.FirstProviderMetaData;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,
//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作
public
class
DatabaseHelper
extends
SQLiteOpenHelper {
private
static
final
int
VERSION =
1
;
//在SQLiteOepnHelper的子类当中,必须有该构造函数
public
DatabaseHelper(Context context, String name, CursorFactory factory,
int
version) {
//必须通过super调用父类当中的构造函数
super
(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public
DatabaseHelper(Context context,String name){
this
(context,name,VERSION);
}
public
DatabaseHelper(Context context,String name,
int
version){
this
(context, name,
null
,version);
}
//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
@Override
public
void
onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
System.out.println(
"create a Database"
);
//execSQL函数用于执行SQL语句
db.execSQL(
"create table user(id int,name varchar(20))"
);
}
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
// TODO Auto-generated method stub
System.out.println(
"update a Database"
);
}
}
FirstProviderMetaData.java:
package ycitss.cp; import android.net.Uri;
import android.provider.BaseColumns; public class FirstProviderMetaData {
public static final String AUTHORITY = "ycitss.cp.FirstContentProvider";
//数据库名称
public static final String DATABASE_NAME = "FirstProvider.db";
//数据库的版本
public static final int DATABASE_VERSION = 1;
//表名
public static final String USERS_TABLE_NAME = "users"; public static final class UserTableMetaData implements BaseColumns {
//表名
public static final String TABLE_NAME = "users";
//访问该ContenProvider的URI
public static final Uri CONTENT_URI = Uri.parse("content://"
+ AUTHORITY + "/users");
//该ContentProvider所返回的数据类型的定义
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";
public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";
//列名
public static final String USER_NAME = "name";
//默认的排序方法
public static final String DEFAULT_SORT_ORDER = "_id desc";
}
}
FirstContentProvider.java
package ycitss.cp; import java.util.HashMap; import ycitss.cp.FirstProviderMetaData.UserTableMetaData;
import ycitss.sqlite3.db.DatabaseHelper;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils; public class FirstContentProvider extends ContentProvider { public static final UriMatcher uriMatcher;
public static final int INCOMING_USER_COLLECTION = 1;
public static final int INCOMING_USER_SINGLE = 2; private DatabaseHelper dh; static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(FirstProviderMetaData.AUTHORITY, "users",
INCOMING_USER_COLLECTION);
uriMatcher.addURI(FirstProviderMetaData.AUTHORITY, "users/#",
INCOMING_USER_SINGLE);
} public static HashMap<String, String> userProjectionMap;
static {
userProjectionMap = new HashMap<String, String>();
userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
userProjectionMap.put(UserTableMetaData.USER_NAME,
UserTableMetaData.USER_NAME);
} @Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stub
System.out.println("delete...");
return 0;
}
//根据传入的URI,返回该URI所表示的数据类型
@Override
public String getType(Uri uri) {
System.out.println("getType...");
switch (uriMatcher.match(uri)) {
case INCOMING_USER_COLLECTION:
return UserTableMetaData.CONTENT_TYPE;
case INCOMING_USER_SINGLE:
return UserTableMetaData.CONTENT_TYPE_ITEM;
default:
throw new IllegalArgumentException("Unknow URI " + uri);
}
} /**
* 该函数的返回值是一个Uri,这个Uri表示的是刚刚使用这个函数所传入的数据
* content://ycitss.cp.firstContentProivder/users/1
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
System.out.println("insert...");
SQLiteDatabase db = dh.getWritableDatabase();
long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
if (rowId > 0) {
Uri insertedUserUri = ContentUris.withAppendedId(
UserTableMetaData.CONTENT_URI, rowId);
//通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(insertedUserUri,
null);
return insertedUserUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
//是一个回调方法,所以说在ContentProvider创建的时候执行
@Override
public boolean onCreate() {
//打开数据库
dh = new DatabaseHelper(getContext(),
FirstProviderMetaData.DATABASE_NAME);
System.out.println("onCreate...");
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
switch (uriMatcher.match(uri)) {
case INCOMING_USER_COLLECTION:
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
break;
case INCOMING_USER_SINGLE:
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
qb.appendWhere(UserTableMetaData._ID + "="
+ uri.getPathSegments().get(1));
break;
}
String orderBy;
if (TextUtils.isEmpty(sortOrder)) {
orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
} else {
orderBy = sortOrder;
}
SQLiteDatabase db = dh.getWritableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null,
null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
System.out.println("query...");
return c;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
System.out.println("update...");
return 0;
} }
CPActivity.java:
package ycitss.cp; import ycitss.cp.FirstProviderMetaData.UserTableMetaData;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class CPActivity extends Activity {
/** Called when the activity is first created. */
private Button insertButton = null;
private Button queryButton = null; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
insertButton = (Button) findViewById(R.id.insertButton);
insertButton.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put(FirstProviderMetaData.UserTableMetaData.USER_NAME,
"zhangsan");
Uri uri = getContentResolver().insert(
FirstProviderMetaData.UserTableMetaData.CONTENT_URI,
values);
System.out.println("uri ---> " + uri.toString());
}
});
queryButton = (Button) findViewById(R.id.queryButton);
queryButton.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Cursor c = getContentResolver().query(
FirstProviderMetaData.UserTableMetaData.CONTENT_URI,
null, null, null, null);
while (c.moveToNext()) {
System.out.println(c.getString(c
.getColumnIndex(UserTableMetaData.USER_NAME)));
} }
});
}
}
Content Provider基础的更多相关文章
- Android Content Provider基础
Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...
- Android开发-API指南-Content Provider基础
Content Provider Basics 英文原文:http://developer.android.com/guide/topics/providers/content-provider-ba ...
- (转载)Android content provider基础与使用
android有一个独特之处就是,数据库只能被它的创建者所使用,其他的应用是不能访问到的,所以如果你想实现不同应用之间的数据共享,就不得不用content provider了.在Android中,co ...
- Content Provider Basics ——Content Provider基础
A content provider manages access to a central repository of data. A provider is part of an Android ...
- Android开发-API指南-创建 Content Provider
Creating a Content Provider 英文原文:http://developer.android.com/guide/topics/providers/content-provide ...
- Android开发-API指南-Content Provider
Content Providers 英文原文:http://developer.android.com/guide/topics/providers/content-providers.html 采集 ...
- Android学习之基础知识十—内容提供器(Content Provider)
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
- Android应用程序组件Content Provider的共享数据更新通知机制分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6985171 在Android系统中,应用程序组 ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...
随机推荐
- 操作COOKIE的函数
一个同学慧涛分享给我的他写的操作cookie的函数,贴出来,做个笔记: //操作cookie //删除cookie hcookie('cookiename','','del'); //查询cookie ...
- 【代码学习】PYTHON字典(Dictionary)
一.什么是字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key->value)对用(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如下 d ...
- 解决chrome记住账号默认样式覆盖
当谷歌游览器记住账号后,输入框的颜色会变为黄色,最直接的方法:加入以下代码 input:-webkit-autofill , textarea:-webkit-autofill, select:-we ...
- JavaScript 深度遍历对象的两种方式,递归与非递归
递归遍历: 基本问题: 当前属性值不为对象时,打印键和值 递归过程:当前属性值为对象时,打印键,继续递归 var o = { a: { b: { c: { d: { e: { f: 1, g:{ h: ...
- 学校实训作业:Java爬虫(WebMagic框架)的简单操作
项目名称:java爬虫 项目技术选型:Java.Maven.Mysql.WebMagic.Jsp.Servlet 项目实施方式:以认知java爬虫框架WebMagic开发为主,用所学java知识完成指 ...
- 关于找不到指定的模块,异常来自HRESULT:0x8007007E的解决方法
上午从公司前辈那里拷贝到的ASP.NET代码,在自己机器上部署的时候发现问题,直接报错,找不到指定的模块,异常来自HRESULT:0x8007007E.并且一大堆警告. 在网上百度很多解决方法,归纳如 ...
- jxl读取设置过数据有效性的xls文件报错
//在用jxl读入excel时,一直报如下错误: Warning: Cannot read drop down range Unrecognized token 43 Exception in thr ...
- MVC集合ModelBinder
使用腳本提交集合类时,MVC binding public class FormExtensionValueProviderFactory : ValueProviderFactory { publi ...
- SpringBoot 集成Log4j、集成AOP
集成Log4j (1)在pom.xml中添加依赖 <!--去掉springboot默认的日志--> <dependency> <groupId>org.spring ...
- npm安装包时的几种模式
本文原文地址:https://www.limitcode.com/detail/59a15b1a69e95702e0780249.html 回顾 npm install 命令 最近在写Node程序的时 ...