package com.mcxiaoke.minicat.dao;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.provider.BaseColumns;
import android.util.Log;
import com.mcxiaoke.minicat.AppContext;
import com.mcxiaoke.minicat.dao.model.DirectMessageColumns;
import com.mcxiaoke.minicat.dao.model.IBaseColumns;
import com.mcxiaoke.minicat.dao.model.StatusColumns;
import com.mcxiaoke.minicat.dao.model.StatusUpdateInfoColumns;
import com.mcxiaoke.minicat.dao.model.UserColumns;
import java.util.List;
/**
* @author mcxiaoke
* @version 7.0 2012.03.19
*/
public final class DataProvider extends ContentProvider implements IBaseColumns {
public static final String ORDERBY_TIME = IBaseColumns.TIME;
public static final String ORDERBY_TIME_DESC = IBaseColumns.TIME + " DESC";
public static final String ORDERBY_RAWID = IBaseColumns.RAWID;
public static final String ORDERBY_RAWID_DESC = IBaseColumns.RAWID
+ " DESC";
public static final int USERS = 1;// 查询全部用户信息,可附加条件参数
public static final int USER_ID = 5; // 根据ID查询单个用户
public static final int STATUSES = 21;
public static final int STATUS_ID = 22;
public static final int MESSAGES = 41;// 所有私信
public static final int MESSAGE_ID = 46;
public static final int RECORDS = 61;
public static final int RECORD_ID = 62;
private static final boolean DEBUG = AppContext.DEBUG;
private static final String TAG = DataProvider.class.getSimpleName();
private static final UriMatcher sUriMatcher;
static {
// no match
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// user list
sUriMatcher.addURI(AUTHORITY, UserColumns.TABLE_NAME, USERS);
sUriMatcher
.addURI(AUTHORITY, UserColumns.TABLE_NAME + "/id/*", USER_ID);
// timeline
sUriMatcher.addURI(AUTHORITY, StatusColumns.TABLE_NAME, STATUSES);
sUriMatcher.addURI(AUTHORITY, StatusColumns.TABLE_NAME + "/id/*",
STATUS_ID);
// direct message
sUriMatcher
.addURI(AUTHORITY, DirectMessageColumns.TABLE_NAME, MESSAGES);
sUriMatcher.addURI(AUTHORITY,
DirectMessageColumns.TABLE_NAME + "/id/*", MESSAGE_ID);
// record
sUriMatcher.addURI(AUTHORITY, StatusUpdateInfoColumns.TABLE_NAME, RECORDS);
sUriMatcher.addURI(AUTHORITY, StatusUpdateInfoColumns.TABLE_NAME + "/#",
RECORD_ID);
}
private SQLiteHelper dbHelper;
private void log(String message) {
Log.d(TAG, message);
}
@Override
public boolean onCreate() {
dbHelper = new SQLiteHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] columns, String where,
String[] whereArgs, String orderBy) {
if (AppContext.DEBUG) {
// Log.d(TAG, "query() uri = " + uri + " where = (" + where
// + ") whereArgs = " + StringHelper.toString(whereArgs)
// + " orderBy = " + orderBy);
// List<String> paths = uri.getPathSegments();
// for (int i = 0; i < paths.size(); i++) {
// Log.d(TAG,
// "getPathSegments() path[" + i + "] --> " + paths.get(i));
// }
}
switch (sUriMatcher.match(uri)) {
case USERS:
case STATUSES:
case MESSAGES:
case RECORDS:
return queryCollection(uri, columns, where, whereArgs, orderBy);
case USER_ID:
case STATUS_ID:
case MESSAGE_ID:
return queryItemById(uri);
case RECORD_ID:
throw new UnsupportedOperationException("unsupported operation: "
+ uri);
default:
throw new IllegalArgumentException("query() Unknown URI " + uri);
}
}
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case USERS:
return UserColumns.CONTENT_TYPE;
case USER_ID:
return UserColumns.CONTENT_ITEM_TYPE;
case STATUSES:
return StatusColumns.CONTENT_TYPE;
case STATUS_ID:
return StatusColumns.CONTENT_ITEM_TYPE;
case MESSAGES:
return DirectMessageColumns.CONTENT_TYPE;
case MESSAGE_ID:
return DirectMessageColumns.CONTENT_ITEM_TYPE;
case RECORDS:
return StatusUpdateInfoColumns.CONTENT_TYPE;
case RECORD_ID:
return StatusUpdateInfoColumns.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("getType() Unknown URI " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
if (DEBUG) {
// Log.d(TAG, "insert() uri: " + uri);
// List<String> paths = uri.getPathSegments();
// for (int i = 0; i < paths.size(); i++) {
// Log.d(TAG,
// "getPathSegments() path[" + i + "] --> " + paths.get(i));
// }
}
switch (sUriMatcher.match(uri)) {
case USERS:
case STATUSES:
case MESSAGES:
case RECORDS:
insertItem(uri, values);
return uri;
case USER_ID:
case STATUS_ID:
case MESSAGE_ID:
case RECORD_ID:
throw new UnsupportedOperationException("Cannot insert URI: " + uri);
default:
throw new IllegalArgumentException("insert() Unknown URI " + uri);
}
}
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
int numInserted = 0;
String table = uri.getPathSegments().get(0);
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
try {
for (ContentValues value : values) {
// if (AppContext.DEBUG) {
// Log.d(TAG, "bulkInsert() " + value);
// }
long id = db.insert(table, null, value);
if (id > 0) {
++numInserted;
}
}
db.setTransactionSuccessful();
getContext().getContentResolver().notifyChange(uri, null);
} finally {
db.endTransaction();
}
return numInserted;
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
if (DEBUG) {
// Log.d(TAG, "delete() uri: " + uri + " where: " + where
// + " whereArgs: " + whereArgs);
// List<String> paths = uri.getPathSegments();
// for (int i = 0; i < paths.size(); i++) {
// Log.d(TAG,
// "getPathSegments() path[" + i + "] --> " + paths.get(i));
// }
}
int count;
switch (sUriMatcher.match(uri)) {
case USERS:
case STATUSES:
case RECORDS:
case MESSAGES:
count = deleteByCondition(uri, where, whereArgs);
break;
case USER_ID:
case STATUS_ID:
case MESSAGE_ID:
count = deleteItemById(uri);
break;
case RECORD_ID:
count = deleteRecordById(uri);
break;
default:
throw new IllegalArgumentException("delete() Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values, String where,
String[] whereArgs) {
if (DEBUG) {
// Log.d(TAG, "update() uri: " + uri + " values: " + values
// + " where: " + where + " whereArgs: " + whereArgs);
// List<String> paths = uri.getPathSegments();
// for (int i = 0; i < paths.size(); i++) {
// Log.d(TAG,
// "getPathSegments() path[" + i + "] --> " + paths.get(i));
// }
}
int count;
switch (sUriMatcher.match(uri)) {
case USER_ID:
case STATUS_ID:
case MESSAGE_ID:
count = updateById(uri, values);
break;
case RECORD_ID:
count = updateRecordById(uri, values);
break;
case USERS:
case STATUSES:
case MESSAGES:
case RECORDS:
count = updateByCondition(uri, values, where, whereArgs);
break;
default:
throw new IllegalArgumentException("update() Unknown URI " + uri);
}
if (AppContext.DEBUG) {
// if (count > 0) {
// log("update() result uri=" + uri + " count=" + count);
// }
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
private Cursor queryWithNotify(Uri uri, Cursor cursor) {
if (cursor == null) {
// if (AppContext.DEBUG) {
// log("query() uri " + uri + " failed.");
// }
} else {
cursor.setNotificationUri(getContext().getContentResolver(), uri);
}
return cursor;
}
private Cursor queryCollection(Uri uri, String[] columns, String where,
String[] whereArgs, String orderBy) {
String table = uri.getPathSegments().get(0);
SQLiteDatabase db = dbHelper.getReadableDatabase();
try {
Cursor cursor = db.query(table, null, where, whereArgs, null, null,
orderBy);
return queryWithNotify(uri, cursor);
} catch (Exception ignored) {
return null;
}
}
private Cursor queryItemById(Uri uri) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
final List<String> path = uri.getPathSegments();
String table = path.get(0);
String id = path.get(2);
String selection = IBaseColumns.ID + " =? ";
String[] selectionArgs = new String[]{id};
Cursor cursor = db.query(table, null, selection, selectionArgs, null,
null, null);
return queryWithNotify(uri, cursor);
}
private void insertItem(Uri uri, ContentValues values) {
if (values == null || values.size() == 0) {
throw new NullPointerException("插入数据不能为空.");
}
SQLiteDatabase db = dbHelper.getWritableDatabase();
String table = uri.getPathSegments().get(0);
long rowId = db.insert(table, null, values);
getContext().getContentResolver().notifyChange(uri, null);
if (rowId > 0) {
// getContext().getContentResolver().notifyChange(uri, null);
Uri resultUri = ContentUris.withAppendedId(uri, rowId);
// if (AppContext.DEBUG) {
// log("insert() resultUri=" + resultUri + " id="
// + values.getAsString(ID) + " rowId=" + rowId);
// }
}
}
private int deleteByCondition(Uri uri, String where, String[] whereArgs) {
int count = 0;
try {
String table = uri.getPathSegments().get(0);
SQLiteDatabase db = dbHelper.getWritableDatabase();
count = db.delete(table, where, whereArgs);
} catch (SQLiteException e) {
e.printStackTrace();
}
return count;
}
private int deleteItemById(Uri uri) {
List<String> path = uri.getPathSegments();
String table = path.get(0);
String id = path.get(2);
String where = IBaseColumns.ID + " =? ";
String[] whereArgs = new String[]{id};
return dbHelper.getWritableDatabase().delete(table, where, whereArgs);
}
private int deleteRecordById(Uri uri) {
String id = uri.getPathSegments().get(1);
String table = StatusUpdateInfoColumns.TABLE_NAME;
String where = BaseColumns._ID + " = " + id;
return dbHelper.getWritableDatabase().delete(table, where, null);
}
private int updateById(Uri uri, ContentValues values) {
List<String> path = uri.getPathSegments();
String table = path.get(0);
String id = path.get(2);
return dbHelper.getWritableDatabase().update(table, values,
IBaseColumns.ID + "=?", new String[]{id});
}
private int updateRecordById(Uri uri, ContentValues values) {
List<String> path = uri.getPathSegments();
String table = path.get(0);
String id = path.get(2);
return dbHelper.getWritableDatabase().update(table, values,
BaseColumns._ID + "=?", new String[]{id});
}
private int updateByCondition(Uri uri, ContentValues values, String where,
String[] whereArgs) {
List<String> path = uri.getPathSegments();
String table = path.get(0);
return dbHelper.getWritableDatabase().update(table, values, where,
whereArgs);
}
}