- 第三部,与已经注册的Uri进行匹配:
/*
-
如果操作集合,则必须以vnd.android.cursor.dir开头
-
如果操作非集合,则必须以vnd.android.cursor.item开头
-
*/
@Override
public String getType(Uri uri) {
Uri uri = Uri.parse(“content://” + “cn.scu.myprovider” + “/user”);
switch(matcher.match(uri)){
case USER:
return “vnd.android.cursor.dir/user”;
case USER_ID:
return “vnd.android.cursor.item/user”;
}
}
##3ContentProvider的主要方法
public boolean onCreate()
ContentProvider创建后 或 打开系统后其它应用第一次访问该ContentProvider时调用。
public Uri insert(Uri uri, ContentValues values)
外部应用向ContentProvider中添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
外部应用从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):
外部应用更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
供外部应用从ContentProvider中获取数据。
public String getType(Uri uri)
该方法用于返回当前Url所代表数据的MIME类型。
##4ContentResolver
ContentResolver通过URI来查询ContentProvider中提供的数据。除了URI以 外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。
ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
public Uri insert(Uri uri, ContentValues values) //添加
public int delete(Uri uri, String selection, String[] selectionArgs) //删除
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) //更新
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)//获取
实例代码:
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse(“content://cn.scu.myprovider/user”);
//添加一条记录
ContentValues values = new ContentValues();
values.put(“name”, “fanrunqi”);
values.put(“age”, 24);
resolver.insert(uri, values);
//获取user表中所有记录
Cursor cursor = resolver.query(uri, null, null, null, “userid desc”);
while(cursor.moveToNext()){
//操作
}
//把id为1的记录的name字段值更改新为finch
ContentValues updateValues = new ContentValues();
updateValues.put(“name”, “finch”);
Uri updateIdUri = ContentUris.withAppendedId(uri, 1);
resol
资料获取→专栏
ver.update(updateIdUri, updateValues, null, null);
//删除id为2的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
5 ContentObserver
ContentObserver(内容观察者),目的是观察特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigg
er),当ContentObserver所观察的Uri发生变化时,便会触发它.
下面是使用内容观察者监听短信的例子:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册观察者Observser
this.getContentResolver().registerContentObserver(Uri.parse(“content://sms”),true,new SMSObserver(new Handler()));
}
private final class SMSObserver extends ContentObserver {
public SMSObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
Cursor cursor = MainActivity.this.getContentResolver().query(
Uri.parse(“content://sms/inbox”), null, null, null, null);
while (cursor.moveToNext()) {
StringBuilder sb = new StringBuilder();
sb.append(“address=”).append(
cursor.getString(cursor.getColumnIndex(“address”)));
sb.append(“;subject=”).append(
cursor.getString(cursor.getColumnIndex(“subject”)));
sb.append(“;body=”).append(
cursor.getString(cursor.getColumnIndex(“body”)));
sb.append(“;time=”).append(
cursor.getLong(cursor.getColumnIndex(“date”)));
System.out.println(“--------has Receivered SMS::” + sb.toString());
}
}
}
}
同时可以在ContentProvider发生数据变化时调用 getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者。
public class UserContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert(“user”, “userid”, values);
getContext().getContentResolver().notifyChange(uri, null);
}
}
##6 实例说明
数据源是SQLite, 用ContentResolver操作ContentProvider。
Constant.Java(储存一些常量)
public class Constant {
public static final String TABLE_NAME = “user”;
public static final String COLUMN_ID = “_id”;
public static final String COLUMN_NAME = “name”;
public static final String AUTOHORITY = “cn.scu.myprovider”;
public static final int ITEM = 1;
public static final int ITEM_ID = 2;
public static final String CONTENT_TYPE = “vnd.android.cursor.dir/user”;
public static final String CONTENT_ITEM_TYPE = “vnd.android.cursor.item/user”;
public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTOHORITY + “/user”);
}
DBHelper.java(操作数据库)
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = “finch.db”;
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) throws SQLException {
//创建表格
db.execSQL(“CREATE TABLE IF NOT EXISTS “+ Constant.TABLE_NAME + “(”+ Constant.COLUMN_ID +” INTEGER PRIMARY KEY AUTOINCREMENT,” + Constant.COLUMN_NAME +" VARCHAR NOT NULL);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) throws SQLException {
//删除并创建表格
db.execSQL(“DROP TABLE IF EXISTS “+ Constant.TABLE_NAME+”;”);
onCreate(db);
}
}
MyProvider.java(自定义的ContentProvider)
public class MyProvider extends ContentProvider {
DBHelper mDbHelper = null;
SQLiteDatabase db = null;
private static final UriMatcher mMatcher;
static{
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mMatcher.addURI(Constant.AUTOHORITY,Constant.TABLE_NAME, Constant.ITEM);
mMatcher.addURI(Constant.AUTOHORITY, Constant.TABLE_NAME+“/#”, Constant.ITEM_ID);
}
@Override
public String getType(Uri uri) {
switch (mMatcher.match(uri)) {
case Constant.ITEM:
return Constant.CONTENT_TYPE;
case Constant.ITEM_ID:
return Constant.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException(“Unknown URI”+uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
long rowId;
if(mMatcher.match(uri)!=Constant.ITEM){
throw new IllegalArgumentException(“Unknown URI”+uri);
}
rowId = db.insert(Constant.TABLE_NAME,null,values);
if(rowId>0){
Uri noteUri=ContentUris.withAppendedId(Constant.CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
mDbHelper = new DBHelper(getContext());
db = mDbHelper.getReadableDatabase();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Cursor c = null;
switch (mMatcher.match(uri)) {
case Constant.ITEM:
c = db.query(Constant.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case Constant.ITEM_ID:
c = db.query(Constant.TABLE_NAME, projection,Constant.COLUMN_ID + “=”+uri.getLastPathSegment(), selectionArgs, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException(“Unknown URI”+uri);
}
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
MainActivity.java(ContentResolver操作)
public class MainActivity extends Activity {
private ContentResolver mContentResolver = null;
private Cursor cursor = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
mContentResolver = getContentResolver();
tv.setText("添加初始数据 ");
for (int i = 0; i < 10; i++) {
tResolver mContentResolver = null;
private Cursor cursor = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
mContentResolver = getContentResolver();
tv.setText("添加初始数据 ");
for (int i = 0; i < 10; i++) {