package com.xiaomi.xms.sales.db;
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.net.Uri;
import android.text.TextUtils;
import com.xiaomi.xms.sales.db.DBContract.Cache;
import com.xiaomi.xms.sales.db.DBContract.Category;
import com.xiaomi.xms.sales.db.DBContract.DataStats;
import com.xiaomi.xms.sales.db.DBContract.Region;
import com.xiaomi.xms.sales.db.DatabaseHelper.Tables;
import com.xiaomi.xms.sales.util.LogUtil;
public class ShopProvider extends ContentProvider {
private static final UriMatcher mMatcher;
private DatabaseHelper mHelper;
private static final String TAG = "ShopProvider";
private static final int URI_CATEGORY = 1;
private static final int URI_CATEGORY_ITEM = 2;
private static final int URI_CACHE = 3;
private static final int URI_CACHE_ITEM = 4;
private static final int URI_REGION = 5;
private static final int URI_DATASTATS = 6;
private static final int URI_REGION_UPDATE = 7;
static {
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mMatcher.addURI(DBContract.AUTHORITY, Category.DIRECTORY, URI_CATEGORY);
mMatcher.addURI(DBContract.AUTHORITY, Category.DIRECTORY + "/#", URI_CATEGORY_ITEM);
mMatcher.addURI(DBContract.AUTHORITY, Cache.DIRECTORY, URI_CACHE);
mMatcher.addURI(DBContract.AUTHORITY, Cache.DIRECTORY + "/#", URI_CACHE_ITEM);
mMatcher.addURI(DBContract.AUTHORITY, Region.DIRECTORY, URI_REGION);
mMatcher.addURI(DBContract.AUTHORITY, Region.UPDATE_DIRECTORY, URI_REGION_UPDATE);
mMatcher.addURI(DBContract.AUTHORITY, DataStats.DIRECTORY, URI_DATASTATS);
}
@Override
public boolean onCreate() {
mHelper = DatabaseHelper.getInstance(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
Cursor c = null;
SQLiteDatabase db = mHelper.getReadableDatabase();
switch (mMatcher.match(uri)) {
case URI_CATEGORY:
c = db.query(Tables.CATEGORY, projection, selection, selectionArgs, null, null,
sortOrder);
break;
case URI_CACHE:
c = db.query(Tables.CACHE, projection, selection, selectionArgs, null, null,
sortOrder);
break;
case URI_REGION:
c = db.query(Tables.REGION, projection, selection, selectionArgs, null, null,
sortOrder);
break;
case URI_DATASTATS:
c = db.query(Tables.DATASTATS, projection, selection, selectionArgs, null, null,
sortOrder);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (c != null) {
c.setNotificationUri(getContext().getContentResolver(), uri);
}
return c;
}
private String parseSelection(String selection) {
return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mHelper.getWritableDatabase();
long insertedId = 0;
switch (mMatcher.match(uri)) {
case URI_CATEGORY:
insertedId = db.insert(Tables.CATEGORY, null, values);
break;
case URI_CACHE:
insertedId = db.insert(Tables.CACHE, null, values);
break;
case URI_REGION:
insertedId = db.insert(Tables.REGION, null, values);
break;
case URI_DATASTATS:
insertedId = db.insert(Tables.DATASTATS, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (insertedId > 0) {
getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(uri, insertedId), null);
LogUtil.d(TAG, "Insert values with uri " + uri.toString());
}
return ContentUris.withAppendedId(uri, insertedId);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
SQLiteDatabase db = mHelper.getWritableDatabase();
switch (mMatcher.match(uri)) {
case URI_CATEGORY:
count = db.delete(Tables.CATEGORY, selection, selectionArgs);
break;
case URI_CATEGORY_ITEM:
String id = uri.getPathSegments().get(1);
count = db.delete(Tables.CATEGORY,
Category._ID + "=" + id + parseSelection(selection), selectionArgs);
break;
case URI_CACHE:
count = db.delete(Tables.CACHE, selection, selectionArgs);
break;
case URI_CACHE_ITEM:
String key = uri.getPathSegments().get(1);
count = db.delete(Tables.CACHE,
Cache.KEY + "=" + key + parseSelection(selection), selectionArgs);
break;
case URI_REGION:
count = db.delete(Tables.REGION, selection, selectionArgs);
break;
case URI_DATASTATS:
count = db.delete(Tables.DATASTATS, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (count > 0) {
getContext().getContentResolver().notifyChange(uri, null);
LogUtil.d(TAG, "Delete " + count + " rows with uri " + uri.toString());
}
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
SQLiteDatabase db = mHelper.getWritableDatabase();
switch (mMatcher.match(uri)) {
case URI_CATEGORY:
count = db.update(Tables.CATEGORY, values, selection, selectionArgs);
break;
case URI_CATEGORY_ITEM:
String id = uri.getPathSegments().get(1);
count = db.update(Tables.CATEGORY, values, Category._ID + "=" + id
+ parseSelection(selection), selectionArgs);
break;
case URI_CACHE:
count = db.update(Tables.CACHE, values, selection, selectionArgs);
break;
case URI_CACHE_ITEM:
String key = uri.getPathSegments().get(1);
count = db.update(Tables.CACHE, values, Cache.KEY + "=" + key
+ parseSelection(selection), selectionArgs);
break;
case URI_DATASTATS:
count = db.update(Tables.DATASTATS, values, selection, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (count > 0) {
getContext().getContentResolver().notifyChange(uri, null);
LogUtil.d(TAG, "Update " + count + " rows with uri " + uri.toString());
}
return count;
}
}