package org.ecomap.android.app.data;
import android.annotation.TargetApi;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.NonNull;
public class EcoMapProvider extends ContentProvider {
//TODO: db-man! please, add here work with Uri
// The URI Matcher used by this content provider.
private static final UriMatcher sUriMatcher = buildUriMatcher();
private EcoMapDBHelper mOpenHelper;
private static final int PROBLEMS = 100;
private static final int RESOURCES = 103;
private static final int PENDING_PROBLEMS = 102;
private static final int REVISIONS = 104;
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = EcoMapContract.CONTENT_AUTHORITY;
// For each type of URI you want to add, create a corresponding code.
matcher.addURI(authority, EcoMapContract.PATH_PROBLEMS, PROBLEMS);
matcher.addURI(authority, EcoMapContract.PATH_RESOURCES, RESOURCES);
matcher.addURI(authority, EcoMapContract.PATH_PENDING_PROBLEMS, PENDING_PROBLEMS);
matcher.addURI(authority, EcoMapContract.PATH_REVISIONS, REVISIONS);
return matcher;
}
@Override
public boolean onCreate() {
mOpenHelper = new EcoMapDBHelper(getContext());
return true;
}
@Override
public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor retCursor;
switch (sUriMatcher.match(uri)) {
// "problems"
case PROBLEMS: {
retCursor = mOpenHelper.getReadableDatabase().query(
EcoMapContract.ProblemsEntry.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
break;
}
case RESOURCES: {
retCursor = mOpenHelper.getReadableDatabase().query(
EcoMapContract.ResourcesEntry.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
break;
}
case REVISIONS: {
retCursor = mOpenHelper.getReadableDatabase().query(
EcoMapContract.RevisionsEntry.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
break;
}
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
Context c = getContext();
if (c != null) {
ContentResolver cr = c.getContentResolver();
retCursor.setNotificationUri(cr, uri);
}
return retCursor;
}
@Override
public String getType(@NonNull Uri uri) {
final int match = sUriMatcher.match(uri);
switch (match) {
case PROBLEMS:
return EcoMapContract.ProblemsEntry.CONTENT_TYPE;
case PENDING_PROBLEMS:
return EcoMapContract.PendingProblemsEntry.CONTENT_TYPE;
case RESOURCES:
return EcoMapContract.ResourcesEntry.CONTENT_TYPE;
case REVISIONS:
return EcoMapContract.RevisionsEntry.CONTENT_TYPE;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
@Override
public Uri insert(@NonNull Uri uri, ContentValues values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
Uri returnUri;
switch (match) {
case PROBLEMS: {
long _id = db.insert(EcoMapContract.ProblemsEntry.TABLE_NAME, null, values);
if (_id > 0)
returnUri = EcoMapContract.ProblemsEntry.buildProblemsUri(_id);
else
throw new android.database.SQLException("Failed to insert row into " + uri);
break;
}
case PENDING_PROBLEMS: {
long _id = db.insert(EcoMapContract.PendingProblemsEntry.TABLE_NAME, null, values);
if (_id > 0)
returnUri = EcoMapContract.PendingProblemsEntry.buildPendingProblemsUri(_id);
else
throw new android.database.SQLException("Failed to insert row into " + uri);
break;
}
case RESOURCES: {
long _id = db.insert(EcoMapContract.ResourcesEntry.TABLE_NAME, null, values);
if (_id > 0)
returnUri = EcoMapContract.ResourcesEntry.buildResourcesUri(_id);
else
throw new android.database.SQLException("Failed to insert row into " + uri);
break;
}
case REVISIONS: {
long _id = db.insert(EcoMapContract.RevisionsEntry.TABLE_NAME, null, values);
if (_id > 0)
returnUri = EcoMapContract.ResourcesEntry.buildResourcesUri(_id);
else
throw new android.database.SQLException("Failed to insert row into " + uri);
break;
}
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
Context c = getContext();
if (c != null) {
ContentResolver cr = c.getContentResolver();
cr.notifyChange(uri, null);
}
return returnUri;
}
@Override
public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
int rowsDeleted;
// this makes delete all rows return the number of rows deleted
if (null == selection) selection = "1";
switch (match) {
case PROBLEMS:
rowsDeleted = db.delete(
EcoMapContract.ProblemsEntry.TABLE_NAME, selection, selectionArgs);
break;
case PENDING_PROBLEMS:
rowsDeleted = db.delete(
EcoMapContract.PendingProblemsEntry.TABLE_NAME, selection, selectionArgs);
break;
case RESOURCES:
rowsDeleted = db.delete(
EcoMapContract.ResourcesEntry.TABLE_NAME, selection, selectionArgs);
break;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
// Because a null deletes all rows
if (rowsDeleted != 0) {
Context c = getContext();
if (c != null) {
ContentResolver cr = c.getContentResolver();
cr.notifyChange(uri, null);
}
}
return rowsDeleted;
}
@Override
public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
int rowsUpdated;
switch (match) {
case PROBLEMS:
rowsUpdated = db.update(EcoMapContract.ProblemsEntry.TABLE_NAME, values, selection,
selectionArgs);
break;
case RESOURCES:
rowsUpdated = db.update(EcoMapContract.ResourcesEntry.TABLE_NAME, values, selection,
selectionArgs);
break;
case REVISIONS:
rowsUpdated = db.update(EcoMapContract.RevisionsEntry.TABLE_NAME, values, selection,
selectionArgs);
break;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
if (rowsUpdated != 0) {
Context c = getContext();
if (c != null) {
ContentResolver cr = c.getContentResolver();
cr.notifyChange(uri, null);
}
}
return rowsUpdated;
}
@Override
public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
switch (match) {
case PROBLEMS:
db.beginTransaction();
int returnCount = 0;
try {
for (ContentValues value : values) {
String str = String.valueOf(value.get(EcoMapContract.ProblemsEntry.COLUMN_PROBLEM_ID));
long _id = db.update(EcoMapContract.ProblemsEntry.TABLE_NAME, value, "problem_id = ?", new String[]{str});
//long _id = db.insert(EcoMapContract.ProblemsEntry.TABLE_NAME, null, value);
if (_id != -1 && _id != 0) {
returnCount++;
} else {
db.insert(EcoMapContract.ProblemsEntry.TABLE_NAME, null, value);
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
Context c = getContext();
if (c != null) {
ContentResolver cr = c.getContentResolver();
cr.notifyChange(uri, null);
}
return returnCount;
default:
return super.bulkInsert(uri, values);
}
}
@Override
@TargetApi(11)
public void shutdown() {
mOpenHelper.close();
super.shutdown();
}
}