package be.lukin.android.babble.provider;
import java.util.HashMap;
import be.lukin.android.babble.Log;
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.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class BabbleContentProvider extends ContentProvider {
public static final String PHRASE_TABLE_NAME = "phrase";
public static final String AUTHORITY = "be.lukin.android.babble.provider.BabbleContentProvider";
private static final String DATABASE_NAME = "babble.db";
private static final int DATABASE_VERSION = 1;
private static final UriMatcher sUriMatcher;
private static final int PHRASE = 1;
private static final int PHRASE_ID = 2;
private static HashMap<String, String> appsProjectionMap;
private static class DatabaseHelper extends SQLiteOpenHelper {
private final Context mContext;
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + PHRASE_TABLE_NAME + " ("
+ Phrase.Columns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ Phrase.Columns.TIMESTAMP + " TIMESTAMP,"
+ Phrase.Columns.TEXT + " TEXT NOT NULL,"
+ Phrase.Columns.LANG + " TEXT NOT NULL," // TODO: should be short string
+ Phrase.Columns.DIST + " INTEGER,"
+ Phrase.Columns.RESULT + " TEXT NOT NULL"
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("Upgrading database v" + oldVersion + " -> v" + newVersion + ", which will destroy all old data.");
db.execSQL("DROP TABLE IF EXISTS " + PHRASE_TABLE_NAME);
onCreate(db);
}
}
private DatabaseHelper dbHelper;
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case PHRASE:
count = db.delete(PHRASE_TABLE_NAME, where, whereArgs);
break;
case PHRASE_ID:
String appId = uri.getPathSegments().get(1);
count = db.delete(
PHRASE_TABLE_NAME,
Phrase.Columns._ID + "=" + appId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""),
whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case PHRASE:
return Phrase.Columns.CONTENT_TYPE;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
ContentValues values;
if (initialValues != null) {
values = new ContentValues(initialValues);
} else {
values = new ContentValues();
}
SQLiteDatabase db = dbHelper.getWritableDatabase();
long rowId = 0;
Uri returnUri = null;
switch (sUriMatcher.match(uri)) {
case PHRASE:
rowId = db.insert(PHRASE_TABLE_NAME, Phrase.Columns.TEXT, values);
if (rowId <= 0) {
throw new SQLException("Failed to insert row into " + uri);
}
returnUri = ContentUris.withAppendedId(Phrase.Columns.CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(returnUri, null);
return returnUri;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
@Override
public boolean onCreate() {
dbHelper = new DatabaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
switch (sUriMatcher.match(uri)) {
case PHRASE:
qb.setTables(PHRASE_TABLE_NAME);
qb.setProjectionMap(appsProjectionMap);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case PHRASE:
count = db.update(PHRASE_TABLE_NAME, values, where, whereArgs);
break;
case PHRASE_ID:
String appId = uri.getPathSegments().get(1);
count = db.update(
PHRASE_TABLE_NAME,
values,
Phrase.Columns._ID + "=" + appId + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""),
whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(AUTHORITY, PHRASE_TABLE_NAME, PHRASE);
sUriMatcher.addURI(AUTHORITY, PHRASE_TABLE_NAME + "/#", PHRASE_ID);
appsProjectionMap = new HashMap<String, String>();
appsProjectionMap.put(Phrase.Columns._ID, Phrase.Columns._ID);
appsProjectionMap.put(Phrase.Columns.TIMESTAMP, Phrase.Columns.TIMESTAMP);
appsProjectionMap.put(Phrase.Columns.TEXT, Phrase.Columns.TEXT);
appsProjectionMap.put(Phrase.Columns.LANG, Phrase.Columns.LANG);
appsProjectionMap.put(Phrase.Columns.DIST, Phrase.Columns.DIST);
appsProjectionMap.put(Phrase.Columns.RESULT, Phrase.Columns.RESULT);
}
}