package com.databases.example.database;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.widget.Toast;
import com.databases.example.features.categories.Category;
import com.databases.example.features.categories.Subcategory;
import com.databases.example.features.checkbook.accounts.Account;
import com.databases.example.features.checkbook.transactions.Transaction;
import com.databases.example.features.plans.Plan;
import com.databases.example.features.plans.PlanUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import timber.log.Timber;
/**
* Created by kwelsh on 3/7/17.
* Utils class to add default data
*/
public class DatabaseUtils {
/**
* Deletes all Accounts, Transactions, and Plans
*
* @param context
* @return whether the delete was successful or not
*/
public static boolean deleteDatabase(Context context) {
Timber.d("Deleting database...");
try {
Uri uri = Uri.parse(MyContentProvider.ACCOUNTS_URI + "/");
context.getContentResolver().delete(uri, null, null);
uri = Uri.parse(MyContentProvider.TRANSACTIONS_URI + "/");
context.getContentResolver().delete(uri, null, null);
uri = Uri.parse(MyContentProvider.PLANS_URI + "/");
context.getContentResolver().delete(uri, null, null);
return true;
} catch (Exception e) {
Timber.e("Couldn't delete database. Error e=" + e);
}
return false;
}
/**
* Copies the database file at the specified location over the current
* internal application database.
*/
public static void exportDB(Context context) {
FileChannel src = null;
FileChannel dst = null;
try {
if (!context.getExternalFilesDir(null).exists()) {
context.getExternalFilesDir(null).mkdir();
}
File data = Environment.getDataDirectory();
if (context.getExternalFilesDir(null).canWrite()) {
String currentDBPath = "//data//" + context.getPackageName()
+ "//databases//" + DatabaseHelper.DATABASE_NAME;
String backupDBPath = "/" + DatabaseHelper.DATABASE_NAME + "Backup.db";
File currentDB = new File(data, currentDBPath);
File backupDB = new File(context.getExternalFilesDir(null), backupDBPath);
src = new FileInputStream(currentDB).getChannel();
dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Timber.d("Successfully backed up database: " + backupDBPath);
Toast.makeText(context, "Backup Successful", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Timber.e(e);
e.printStackTrace();
Toast.makeText(context, "Backup Error\n" + e.toString(), Toast.LENGTH_LONG).show();
} finally {
if (src != null) {
try {
src.close();
dst.close();
} catch (IOException e) {
Timber.e("Failed to clean up databases on backup failure! " + e);
e.printStackTrace();
}
}
}
}
public static void addTestData(Context context) {
Timber.d("Adding Test Data...");
ArrayList<Transaction> transactions = new ArrayList<>();
transactions.add(new Transaction(-1, -1, -1, "STARTING BALANCE", "5000.00", "Deposit", "STARTING BALANCE", "", "This is an automatically generated transaction created when you add an account", "2017-03-01", "06:10", "true"));
transactions.add(new Transaction(-1, -1, -1, "Cash withdraw", "160.00", "Withdraw", "Withdraw", "", "Need some extra cash", "2017-03-05", "18:23", "true"));
transactions.add(new Transaction(-1, -1, -1, "Devon's Wedding Gift", "250.00", "Withdraw", "Gift", "8675309", "Check for Devon's Wedding", "2017-03-08", "9:17", "false"));
long checkingId = insertAccount(context, new Account(-1, "Checking", "4590.00", "2017-03-01", "06:10"), transactions);
transactions.clear();
transactions.add(new Transaction(-1, -1, -1, "STARTING BALANCE", "10000.00", "Deposit", "STARTING BALANCE", "", "This is an automatically generated transaction created when you add an account", "2017-03-07", "18:30", "true"));
long savingsId = insertAccount(context, new Account(-1, "Savings", "10000.00", "2017-03-07", "18:30"), transactions);
transactions.clear();
transactions.add(new Transaction(-1, -1, -1, "STARTING BALANCE", "100.00", "Deposit", "STARTING BALANCE", "", "This is an automatically generated transaction created when you add an account", "2017-03-11", "12:45", "true"));
transactions.add(new Transaction(-1, -1, -1, "Hotdog Bet", "5.00", "Deposit", "Personal", "", "Tyler finally paid me for eating 7 hotdogs", "2017-03-12", "16:57", "true"));
long cashId = insertAccount(context, new Account(-1, "Cash", "105.00", "2017-03-11", "12:45"), transactions);
insertPlan(context, new Plan(1, (int) checkingId, "Paycheck", "2200.00", "Deposit",
"Paycheck", "Time to get paid!", "2017-03-10", "2 Weeks", "2017-03-24", "true", "true"), checkingId);
//Annoying Transaction
insertPlan(context, new Plan(2, (int) cashId, "Annoying Transaction", "50.00", "Deposit",
"Gift", "This is an annoying test plan...", "2017-03-09", "1 Days", "2017-03-13", "true", "true"), cashId);
}
public static void addDefaultCategories(final Context context) {
Timber.d("Adding Default Categories...");
//Default
ArrayList<Subcategory> subcategories = new ArrayList<>();
subcategories.add(new Subcategory(-1, -1, true, "STARTING BALANCE", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "TRANSFER", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Default", "Default Category"), subcategories);
//ATM
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Deposit", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Withdraw", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "ATM", "Default Category"), subcategories);
//Car
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Road Services", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Fuel", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Maintenance", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Car", "Default Category"), subcategories);
//Food
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Snacks", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Restaurant", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Groceries", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Food", "Default Category"), subcategories);
//Fun
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Entertainment", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Electronics", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Shopping", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Fun", "Default Category"), subcategories);
//Housing
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Mortgage", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Rent", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Maintenance", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Decorating", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "House", "Default Category"), subcategories);
//Insurance
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Auto", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Health", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Dental", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Home", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Life", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Insurance", "Default Category"), subcategories);
//Job
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Paycheck", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Tax", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Income", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Job", "Default Category"), subcategories);
//Loans
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Auto", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Home Equity", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Mortgage", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Student", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Loans", "Default Category"), subcategories);
//Personal
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Gift", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Donation", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Personal", "Default Category"), subcategories);
//Random
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Interest", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Tip", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Random", "Default Category"), subcategories);
//Travel
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Airplane", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Car Rental", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Dining", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Hotel", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Misc Expenses", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Taxi", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Travel", "Default Category"), subcategories);
//Utils
subcategories.clear();
subcategories.add(new Subcategory(-1, -1, true, "Gas", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Electricity", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Heat", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Water", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Air Conditioning", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Internet", "Default Subcategory"));
subcategories.add(new Subcategory(-1, -1, true, "Garbage", "Default Subcategory"));
insertCategory(context, new Category(-1, true, "Utilities", "Default Category"), subcategories);
}
private static long insertCategory(final Context context, final Category category, final ArrayList<Subcategory> subcategories) {
ContentValues categoryValues = new ContentValues();
categoryValues.put(DatabaseHelper.CATEGORY_IS_DEFAULT, category.isDefault);
categoryValues.put(DatabaseHelper.CATEGORY_NAME, category.name);
categoryValues.put(DatabaseHelper.CATEGORY_NOTE, category.note);
Uri categoriesUri = context.getContentResolver().insert(MyContentProvider.CATEGORIES_URI, categoryValues);
ContentValues subcategoryValues = new ContentValues();
for (Subcategory subcategory : subcategories) {
subcategoryValues.clear();
subcategoryValues.put(DatabaseHelper.SUBCATEGORY_CAT_ID, Long.parseLong(categoriesUri.getLastPathSegment()));
subcategoryValues.put(DatabaseHelper.SUBCATEGORY_IS_DEFAULT, subcategory.isDefault);
subcategoryValues.put(DatabaseHelper.SUBCATEGORY_NAME, subcategory.name);
subcategoryValues.put(DatabaseHelper.SUBCATEGORY_NOTE, subcategory.note);
context.getContentResolver().insert(MyContentProvider.SUBCATEGORIES_URI, subcategoryValues);
}
return Long.parseLong(categoriesUri.getLastPathSegment());
}
private static long insertAccount(final Context context, final Account account, final ArrayList<Transaction> transactions) {
ContentValues accountValues = new ContentValues();
accountValues.put(DatabaseHelper.ACCOUNT_NAME, account.name);
accountValues.put(DatabaseHelper.ACCOUNT_BALANCE, account.balance);
accountValues.put(DatabaseHelper.ACCOUNT_TIME, account.time);
accountValues.put(DatabaseHelper.ACCOUNT_DATE, account.date);
Uri accountUri = context.getContentResolver().insert(MyContentProvider.ACCOUNTS_URI, accountValues);
ContentValues transactionValues = new ContentValues();
for (Transaction transaction : transactions) {
transactionValues.clear();
transactionValues.put(DatabaseHelper.TRANS_ACCT_ID, Long.parseLong(accountUri.getLastPathSegment()));
transactionValues.put(DatabaseHelper.TRANS_PLAN_ID, -1);
transactionValues.put(DatabaseHelper.TRANS_NAME, transaction.name);
transactionValues.put(DatabaseHelper.TRANS_VALUE, transaction.value);
transactionValues.put(DatabaseHelper.TRANS_TYPE, transaction.type);
transactionValues.put(DatabaseHelper.TRANS_CATEGORY, transaction.category);
transactionValues.put(DatabaseHelper.TRANS_CHECKNUM, transaction.checknum);
transactionValues.put(DatabaseHelper.TRANS_MEMO, transaction.memo);
transactionValues.put(DatabaseHelper.TRANS_TIME, transaction.time);
transactionValues.put(DatabaseHelper.TRANS_DATE, transaction.date);
transactionValues.put(DatabaseHelper.TRANS_CLEARED, transaction.cleared);
context.getContentResolver().insert(MyContentProvider.TRANSACTIONS_URI, transactionValues);
}
return Long.parseLong(accountUri.getLastPathSegment());
}
private static long insertPlan(final Context context, final Plan plan, long accountId) {
if (PlanUtils.schedule(context, plan)) {
ContentValues planValues = new ContentValues();
planValues.put(DatabaseHelper.PLAN_ID, plan.id);
planValues.put(DatabaseHelper.PLAN_ACCT_ID, accountId);
planValues.put(DatabaseHelper.PLAN_NAME, plan.name);
planValues.put(DatabaseHelper.PLAN_VALUE, plan.value);
planValues.put(DatabaseHelper.PLAN_TYPE, plan.type);
planValues.put(DatabaseHelper.PLAN_CATEGORY, plan.category);
planValues.put(DatabaseHelper.PLAN_MEMO, plan.memo);
planValues.put(DatabaseHelper.PLAN_OFFSET, plan.offset);
planValues.put(DatabaseHelper.PLAN_RATE, plan.rate);
planValues.put(DatabaseHelper.PLAN_NEXT, plan.next);
planValues.put(DatabaseHelper.PLAN_SCHEDULED, plan.scheduled);
planValues.put(DatabaseHelper.PLAN_CLEARED, plan.cleared);
Uri planUri = context.getContentResolver().insert(MyContentProvider.PLANS_URI, planValues);
return Long.parseLong(planUri.getLastPathSegment());
}
return -1;
}
}