package org.orange.familylink.database; import java.util.HashMap; import org.orange.familylink.database.FamilyLinkDBAdapter.FamilyLinkDBOpenHelper; 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; /** * 联系人的内容提供器 * @author OrangeTeam * */ public class ContactsProvider extends ContentProvider { //所用的数据库创建的类生成一个对象对数据库进行操作 private FamilyLinkDBOpenHelper dbHelper; //为查询设置一个投影映射 private static HashMap<String, String> mContactsProjectionMap; //用常量‘1’代表uri为contacts表的集合 private static final int CONTACTS = 1; //用常量‘2’代表uri为contacts表中的记录 private static final int CONTACT_ID = 2; //用UriMatcher类来识别uri类型 private static final UriMatcher mUriMatcher; static{ //UriMatcher类的实例化 mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加uri与常量进行匹配 mUriMatcher.addURI(Contract.Contacts.AUTHORITY, "contacts", CONTACTS); mUriMatcher.addURI(Contract.Contacts.AUTHORITY, "contacts/#", CONTACT_ID); //查询映射的添加 mContactsProjectionMap = new HashMap<String, String>(); mContactsProjectionMap.put(Contract.Contacts._ID, Contract.Contacts._ID); mContactsProjectionMap.put(Contract.Contacts.COLUMN_NAME_NAME, Contract.Contacts.COLUMN_NAME_NAME); mContactsProjectionMap.put(Contract.Contacts.COLUMN_NAME_PHONE_NUMBER, Contract.Contacts.COLUMN_NAME_PHONE_NUMBER); mContactsProjectionMap.put(Contract.Contacts.COLUMN_NAME_PHOTO, Contract.Contacts.COLUMN_NAME_PHOTO); } /** * 系统调用这个方法时实例化数据库 */ @Override public boolean onCreate() { dbHelper = new FamilyLinkDBOpenHelper(getContext()); return true; } /** * 对contacts表的删除操作 */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); //条件子句 String finalWhere; //用来保存删除的行 int count; switch(mUriMatcher.match(uri)){ case CONTACTS: //对集合类型的删除操作 count = db.delete(Contract.DATABASE_CONTACTS_TABLE, selection, selectionArgs ); break; case CONTACT_ID: //对记录类型的删除操作 finalWhere = Contract.Contacts._ID + " = " + uri.getPathSegments().get(1); if(selection != null){ finalWhere = finalWhere + " AND " + selection; } count = db.delete(Contract.DATABASE_CONTACTS_TABLE, finalWhere, selectionArgs ); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } //设置通知 getContext().getContentResolver().notifyChange(uri, null); return count; } /** * 返回uri类型 */ @Override public String getType(Uri arg0) { switch(mUriMatcher.match(arg0)){ case CONTACTS : //返回集合类型的mime return Contract.Contacts.CONTACTS_TYPE; case CONTACT_ID : //返回单项类型的mime return Contract.Contacts.CONTACTS_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI" + arg0); } } /** * 对contacts表的插入操作 */ @Override public Uri insert(Uri uri, ContentValues values) { //当uri不是代表contacts这个表时为不合法的uri if(mUriMatcher.match(uri) != CONTACTS){ throw new IllegalArgumentException("Unknown URI " + uri); } SQLiteDatabase db = dbHelper.getWritableDatabase(); long rowId = db.insert( Contract.DATABASE_CONTACTS_TABLE, null, values ); //如果插入操作成功返回插入的 uri,且进行通知 if(rowId > 0){ Uri contactUri = ContentUris.withAppendedId(Contract.Contacts.CONTACTS_URI, rowId); getContext().getContentResolver().notifyChange(contactUri, null); return contactUri; } throw new SQLException("Failed to insert row into " + uri); } /** * 对contacts表的查询操作 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); switch(mUriMatcher.match(uri)){ case CONTACTS: //设置查询的表 queryBuilder.setTables(Contract.DATABASE_CONTACTS_TABLE); //设置查询映射 queryBuilder.setProjectionMap(mContactsProjectionMap); break; case CONTACT_ID: queryBuilder.setTables(Contract.DATABASE_CONTACTS_TABLE); queryBuilder.setProjectionMap(mContactsProjectionMap); queryBuilder.appendWhere(Contract.Contacts._ID + " = " + uri.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } String orderBy; if(TextUtils.isEmpty(sortOrder)){ orderBy = Contract.Contacts.CONTACTS_DEFAULT_SORT_ORDER; }else{ orderBy = sortOrder; } SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = queryBuilder.query( db, projection, selection, selectionArgs, null, null, orderBy ); //设置通知 cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } /** * 对contacts表的更新操作 */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); int count; String finalWhere; switch(mUriMatcher.match(uri)){ case CONTACTS: count = db.update(Contract.DATABASE_CONTACTS_TABLE, values, selection, selectionArgs ); break; case CONTACT_ID: finalWhere = Contract.Contacts._ID + " = " +uri.getPathSegments().get(1); if(selection != null){ finalWhere = finalWhere + " AND " + selection; } count = db.update(Contract.DATABASE_CONTACTS_TABLE, values, finalWhere, selectionArgs ); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } /** * for the provider testing * @return a instance of FamilyLinkDBOpenHelper */ public FamilyLinkDBOpenHelper getOpenHelperForTest(){ return dbHelper; } }