package com.code44.finance.data.providers; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import com.code44.finance.common.model.ModelState; import com.code44.finance.data.Query; import com.code44.finance.data.db.Column; import com.code44.finance.data.db.Tables; import com.code44.finance.utils.IOUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; public class TagsProvider extends BaseModelProvider { public static Uri uriTags() { return uriModels(TagsProvider.class, Tables.Tags.TABLE_NAME); } public static Uri uriTag(String tagServerId) { return uriModel(TagsProvider.class, Tables.Tags.TABLE_NAME, tagServerId); } @Override protected String getModelTable() { return Tables.Tags.TABLE_NAME; } @Override protected String getQueryTables(Uri uri) { return getModelTable(); } @Override protected Column getIdColumn() { return Tables.Tags.ID; } @Override protected void onBeforeUpdateItems(Uri uri, ContentValues values, String selection, String[] selectionArgs, Map<String, Object> outExtras) { super.onBeforeUpdateItems(uri, values, selection, selectionArgs, outExtras); throw new IllegalArgumentException("Update is not supported."); } @Override protected void onBeforeDeleteItems(Uri uri, String selection, String[] selectionArgs, ModelState modelState, Map<String, Object> outExtras) { super.onBeforeDeleteItems(uri, selection, selectionArgs, modelState, outExtras); final List<String> affectedIds = getIdList(getIdColumn(), selection, selectionArgs); outExtras.put("affectedIds", affectedIds); } @Override protected void onAfterDeleteItems(Uri uri, String selection, String[] selectionArgs, ModelState modelState, Map<String, Object> extras) { super.onAfterDeleteItems(uri, selection, selectionArgs, modelState, extras); //noinspection unchecked final List<String> affectedIds = (List<String>) extras.get("affectedIds"); if (affectedIds.size() > 0) { final Uri transactionsUri = uriForDeleteFromItemState(TransactionsProvider.uriTransactions(), modelState); final Cursor cursor = Query.create() .projection(Tables.TransactionTags.TRANSACTION_ID.getName()) .selectionInClause(Tables.TransactionTags.TAG_ID.getName(), affectedIds) .from(getDatabase(), Tables.TransactionTags.TABLE_NAME) .execute(); if (cursor.moveToFirst()) { final List<String> transactionIds = new ArrayList<>(); do { transactionIds.add(cursor.getString(0)); } while (cursor.moveToNext()); final Query query = Query.create() .selection(Tables.Transactions.MODEL_STATE + "<>? and ", ModelState.Deleted.asString()) .selectionInClause(Tables.Transactions.ID.getName(), transactionIds); getContext().getContentResolver().delete(transactionsUri, query.getSelection(), query.getSelectionArgs()); } IOUtils.closeQuietly(cursor); } } }