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 MessagesProvider extends ContentProvider{ //所用的数据库创建的类生成一个对象对数据库进行操作 private FamilyLinkDBOpenHelper dbHelper; //为查询设置一个投影映射 private static HashMap<String, String> mMessagesProjectionMap; //用常量‘1’代表uri为messages表的集合 private static final int MESSAGES = 1; //用常量‘2’代表uri为messages表中的记录 private static final int MESSAGE_ID = 2; //用UriMatcher类来识别uri类型 private static final UriMatcher mUriMatcher; static{ //UriMatcher类的实例化 mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加uri与常量进行匹配 mUriMatcher.addURI(Contract.Messages.AUTHORITY, "messages", MESSAGES); mUriMatcher.addURI(Contract.Messages.AUTHORITY, "messages/#", MESSAGE_ID); //查询映射的添加 mMessagesProjectionMap = new HashMap<String, String>(); mMessagesProjectionMap.put(Contract.Messages._ID, Contract.Messages._ID); mMessagesProjectionMap.put(Contract.Messages.COLUMN_NAME_CONTACT_ID, Contract.Messages.COLUMN_NAME_CONTACT_ID); mMessagesProjectionMap.put(Contract.Messages.COLUMN_NAME_ADDRESS, Contract.Messages.COLUMN_NAME_ADDRESS); mMessagesProjectionMap.put(Contract.Messages.COLUMN_NAME_TIME, Contract.Messages.COLUMN_NAME_TIME); mMessagesProjectionMap.put(Contract.Messages.COLUMN_NAME_STATUS, Contract.Messages.COLUMN_NAME_STATUS); mMessagesProjectionMap.put(Contract.Messages.COLUMN_NAME_BODY, Contract.Messages.COLUMN_NAME_BODY); mMessagesProjectionMap.put(Contract.Messages.COLUMN_NAME_CODE, Contract.Messages.COLUMN_NAME_CODE); } /** * 系统调用这个方法时实例化数据库 */ @Override public boolean onCreate() { dbHelper = new FamilyLinkDBOpenHelper(getContext()); return true; } /** * 对messages表的删除操作 */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); //条件子句 String finalWhere; //用来保存删除的行 int count; switch(mUriMatcher.match(uri)){ case MESSAGES: //对集合类型的删除操作 count = db.delete(Contract.DATABASE_MESSAGES_TABLE, selection, selectionArgs ); break; case MESSAGE_ID: //对记录类型的删除操作 finalWhere = Contract.Messages._ID + " = " + uri.getPathSegments().get(1); if(selection != null){ finalWhere = finalWhere + " AND " + selection; } count = db.delete(Contract.DATABASE_MESSAGES_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 MESSAGES : //返回集合类型的mime return Contract.Messages.MESSAGES_TYPE; case MESSAGE_ID : //返回单项类型的mime return Contract.Messages.MESSAGES_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI" + arg0); } } /** * 对messages表的插入操作,数据库中messages表的各个字段(contactId long,address String,time long,status String, * body String,code int)操作时应该注意数据的转换,contactId不是直接放入的是通过Contacts类中的getId方法得到的,time是Date.getTime(), * status是要枚举类型转换为String型,body和code是从Messsages类中来的。 */ @Override public Uri insert(Uri uri, ContentValues values) { //当uri不是代表contacts这个表时为不合法的uri if(mUriMatcher.match(uri) != MESSAGES){ throw new IllegalArgumentException("Unknown URI " + uri); } SQLiteDatabase db = dbHelper.getWritableDatabase(); long rowId = db.insert( Contract.DATABASE_MESSAGES_TABLE, null, values ); //如果插入操作成功返回插入的 uri,且进行通知 if(rowId > 0){ Uri messageUri = ContentUris.withAppendedId(Contract.Messages.MESSAGES_URI, rowId); getContext().getContentResolver().notifyChange(messageUri, null); return messageUri; } throw new SQLException("Failed to insert row into " + uri); } /** * 对messages表的查询操作数据库中messages表的各个字段(contactId long,address String,time long,status String, * body String,code int)操作时应该注意数据的转换,得到的各个字段是要放到Contacts和Messages类中用的,那么time就要转换成Date, * status要转成枚举,因为这里返回的是Cursor所以操作要由调用者自己 * 转换,而数据库操作类中的放回是放到了相应的类中返回的,所以调用者没有转换操作。 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); switch(mUriMatcher.match(uri)){ case MESSAGES: //设置查询的表 queryBuilder.setTables(Contract.DATABASE_MESSAGES_TABLE); //设置查询映射 queryBuilder.setProjectionMap(mMessagesProjectionMap); break; case MESSAGE_ID: queryBuilder.setTables(Contract.DATABASE_MESSAGES_TABLE); queryBuilder.setProjectionMap(mMessagesProjectionMap); queryBuilder.appendWhere(Contract.Messages._ID + " = " + uri.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } String orderBy; if(TextUtils.isEmpty(sortOrder)){ orderBy = Contract.Messages.MESSAGES_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; } /** * 对messages表的更新操作,数据库中messages表的各个字段(contactId long,address String,time long,status String, * body String,code int)操作时应该注意数据的转换,contactId不是直接放入的是通过Contacts类中的getId方法得到的,time是Date.getTime(), * status是要枚举类型转换为String型,body和code是从Messsages类中来的。 */ @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 MESSAGES: count = db.update(Contract.DATABASE_MESSAGES_TABLE, values, selection, selectionArgs ); break; case MESSAGE_ID: finalWhere = Contract.Messages._ID + " = " +uri.getPathSegments().get(1); if(selection != null){ finalWhere = finalWhere + " AND " + selection; } count = db.update(Contract.DATABASE_MESSAGES_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; } }