package com.zenika.signature.db;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;
import com.zenika.signature.app.AppConfig;
public class ZenSignatureContentProvider extends ContentProvider{
public static final String TAG = ZenSignatureContentProvider.class.getSimpleName() + " - ";
private static final String DATABASE_NAME = "bconnect.db";
private static final int DATABASE_VERSION = 1;
private static final int SIGNATURES = 1;
private static final int SIGNATURE_ID = 2;
private static final UriMatcher uriMatcher;
static
{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(ITable.PROVIDER_AUTHORITIES, Signature.DATABASE_TABLE, SIGNATURES);
uriMatcher.addURI(ITable.PROVIDER_AUTHORITIES, Signature.DATABASE_TABLE + "/#", SIGNATURE_ID);
}
private SQLiteDatabase bconnectDB;
@Override
public boolean onCreate()
{
Log.d(AppConfig.TAG, TAG + "onCreate");
OpenDatabaseHelper dbHelper = new OpenDatabaseHelper(getContext(), DATABASE_NAME, null, DATABASE_VERSION);
bconnectDB = dbHelper.getWritableDatabase();
return bconnectDB != null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(getTableName(uri));
// if this is a row query
switch (uriMatcher.match(uri)) {
case SIGNATURE_ID:
qb.appendWhere(BaseColumns._ID + "=" + uri.getLastPathSegment());
break;
default:
break;
}
//if no sort, get default
String orderBy;
if(TextUtils.isEmpty(sortOrder))
{
orderBy = getDefaultOrder(uri);
}
else
{
orderBy = sortOrder;
}
Cursor c = qb.query(bconnectDB, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values)
{
long rowId = bconnectDB.insertOrThrow(getTableName(uri), null, values);
Uri newUri = uri;
switch (uriMatcher.match(uri)) {
case SIGNATURES:
case SIGNATURE_ID:
newUri = Signature.CONTENT_URI;
break;
default:
throw new IllegalArgumentException("Unsupported Uri: " + uri);
}
newUri = ContentUris.withAppendedId(newUri, rowId);
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
int count;
String id;
switch (uriMatcher.match(uri)) {
case SIGNATURES:
count = bconnectDB.update(getTableName(uri), values, selection, selectionArgs);
break;
case SIGNATURE_ID:
id = uri.getLastPathSegment();
count = bconnectDB.update(getTableName(uri), values,
BaseColumns._ID + "=" +id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported Uri: " + uri);
}
return count;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs)
{
int count;
String id;
switch (uriMatcher.match(uri)) {
case SIGNATURES:
count = bconnectDB.delete(getTableName(uri), selection, selectionArgs);
break;
case SIGNATURE_ID:
id = uri.getLastPathSegment();
count = bconnectDB.delete(getTableName(uri),
BaseColumns._ID + "=" +id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported Uri: " + uri);
}
return count;
}
@Override
public String getType(Uri uri)
{
switch (uriMatcher.match(uri)) {
case SIGNATURES: return Signature.TYPES;
case SIGNATURE_ID: return Signature.TYPE;
default: throw new IllegalArgumentException("Unsupported Uri: " + uri);
}
}
private String getTableName(Uri uri)
{
switch (uriMatcher.match(uri)) {
case SIGNATURE_ID:
case SIGNATURES: return Signature.DATABASE_TABLE;
default:
throw new IllegalArgumentException("Unsupported Uri: " + uri);
}
}
private String getDefaultOrder(Uri uri)
{
switch (uriMatcher.match(uri)) {
case SIGNATURES:
case SIGNATURE_ID: return Signature.DEFAULT_SORT_ORDER;
default: throw new IllegalArgumentException("Unsupported Uri: " + uri);
}
}
private static class OpenDatabaseHelper extends SQLiteOpenHelper
{
private static final String TAG = OpenDatabaseHelper.class.getSimpleName() + " - ";
public OpenDatabaseHelper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db)
{
Log.d(AppConfig.TAG, TAG + "onCreate");
// signatures
db.execSQL(Signature.DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
}