package com.kescoode.xmail.db.internal;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.os.Looper;
import android.util.SparseArray;
import com.kescoode.adk.log.Logger;
import com.kescoode.xmail.AppConstant.DB;
import com.kescoode.xmail.AppCtx;
import com.kescoode.xmail.db.*;
import java.net.URI;
public class DataProvider extends ContentProvider {
private static final String MIME_SINGLE = "vnd.android.cursor.item/";
private static final String MIME_MULTIPLE = "vnd.android.cursor.dir/";
private static final int NUM_ITEM_ACCOUNT = 0;
private static final int NUM_DIR_ACCOUNT = 1;
private static final int NUM_ITEM_ATTACHMENT = 2;
private static final int NUM_DIR_ATTACHMENT = 3;
private static final int NUM_ITEM_CONTACT = 4;
private static final int NUM_DIR_CONTACT = 5;
private static final int NUM_ITEM_EMAIL_CONFIG = 6;
private static final int NUM_DIR_EMAIL_CONFIG = 7;
private static final int NUM_ITEM_EMAIL = 8;
private static final int NUM_DIR_EMAIL = 9;
private static final int NUM_ITEM_FOLDER = 10;
private static final int NUM_DIR_FOLDER = 11;
private static final int NUM_ITEM_TASK = 12;
private static final int NUM_DIR_TASK = 13;
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final SparseArray<String> TABLES = new SparseArray<>();
static {
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, AccountDao.TABLE_NAME + "/#", NUM_ITEM_ACCOUNT);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, AccountDao.TABLE_NAME, NUM_DIR_ACCOUNT);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, AttachmentDao.TABLE_NAME + "/#", NUM_ITEM_ATTACHMENT);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, AttachmentDao.TABLE_NAME, NUM_DIR_ATTACHMENT);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, EmailConfigDao.TABLE_NAME + "/#", NUM_ITEM_EMAIL_CONFIG);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, EmailConfigDao.TABLE_NAME, NUM_DIR_EMAIL_CONFIG);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, EmailDao.TABLE_NAME + "/#", NUM_ITEM_EMAIL);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, EmailDao.TABLE_NAME, NUM_DIR_EMAIL);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, FolderDao.TABLE_NAME + "/#", NUM_ITEM_FOLDER);
URI_MATCHER.addURI(DB.PROVIDER_AUTHORITY, FolderDao.TABLE_NAME, NUM_DIR_FOLDER);
TABLES.append(NUM_ITEM_ACCOUNT, AccountDao.TABLE_NAME);
TABLES.append(NUM_DIR_ACCOUNT, AccountDao.TABLE_NAME);
TABLES.append(NUM_ITEM_ATTACHMENT, AttachmentDao.TABLE_NAME);
TABLES.append(NUM_DIR_ATTACHMENT, AttachmentDao.TABLE_NAME);
TABLES.append(NUM_ITEM_EMAIL_CONFIG, EmailConfigDao.TABLE_NAME);
TABLES.append(NUM_DIR_EMAIL_CONFIG, EmailConfigDao.TABLE_NAME);
TABLES.append(NUM_ITEM_EMAIL, EmailDao.TABLE_NAME);
TABLES.append(NUM_DIR_EMAIL, EmailDao.TABLE_NAME);
TABLES.append(NUM_ITEM_FOLDER, FolderDao.TABLE_NAME);
TABLES.append(NUM_DIR_FOLDER, FolderDao.TABLE_NAME);
}
private DBManager DBManager;
public DataProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int n = URI_MATCHER.match(uri);
String table = TABLES.get(n);
if (n % 2 != 0) {
throw new RuntimeException("The mime type get from the uri must be an even number");
}
int index = DBManager.getWritableDatabase().delete(table, selection, selectionArgs);
Logger.d("Uri: %s,\nReturn: %d", uri.toString(), index);
return index;
}
@Override
public String getType(Uri uri) {
int index = URI_MATCHER.match(uri);
String type = getMimePrefix(index) + TABLES.get(index);
Logger.d("Uri: %s,\nReturn: %s", uri.toString(), type);
return type;
}
private String getMimePrefix(int num) {
int remainder = num % 2;
if (remainder == 0) {
return MIME_SINGLE;
} else {
return MIME_MULTIPLE;
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int n = URI_MATCHER.match(uri);
String table = TABLES.get(n);
if (n % 2 == 0) {
throw new RuntimeException("The mime type get from the uri can not be an even number");
}
long index = DBManager.getWritableDatabase().insert(table, null, values);
Logger.d("Uri: %s,\nReturn: %d", uri.toString(), index);
return Uri.parse(DB.PROVIDER_AUTHORITY + "/" + table + "/" + index);
}
@Override
public boolean onCreate() {
/* 目前是单数据库,不排除以后会升级到多数据库 */
DBManager = new DBManager(getContext(), DB.NAME, DB.VERSION);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int n = URI_MATCHER.match(uri);
String table = TABLES.get(n);
Logger.d("Uri: %s,\nTable: %s,\nSQL: %s", uri.toString(), table, selection);
/* 采用手写SQL */
return DBManager.getReadableDatabase().rawQuery(selection, selectionArgs);
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int n = URI_MATCHER.match(uri);
String table = TABLES.get(n);
// if (n % 2 != 0) {
// throw new RuntimeException("The mime type get from the uri must be an even number");
// }
int index = DBManager.getWritableDatabase().update(table, values, selection, selectionArgs);
Logger.d("Uri: %s,\nReturn: %d", uri.toString(), index);
return index;
}
}