mirror of https://github.com/tasks/tasks
Remove DatabaseDao
parent
c830b7f7ec
commit
6d027d01ed
@ -1,172 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2012 Todoroo Inc
|
||||
*
|
||||
* See the file "LICENSE" for the full license governing this code.
|
||||
*/
|
||||
package com.todoroo.andlib.data;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.database.Cursor;
|
||||
|
||||
import com.todoroo.andlib.sql.Criterion;
|
||||
import com.todoroo.andlib.sql.Query;
|
||||
import com.todoroo.astrid.dao.Database;
|
||||
import com.todoroo.astrid.data.Task;
|
||||
import com.todoroo.astrid.helper.UUIDHelper;
|
||||
|
||||
import org.tasks.BuildConfig;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import timber.log.Timber;
|
||||
|
||||
/**
|
||||
* DAO for reading data from an instance of {@link Database}. If you
|
||||
* are writing an add-on for Astrid, you probably want to be using a subclass
|
||||
* of ContentResolverDao instead.
|
||||
*
|
||||
* @author Tim Su <tim@todoroo.com>
|
||||
*
|
||||
*/
|
||||
public class DatabaseDao {
|
||||
|
||||
private final Table table = Task.TABLE;
|
||||
private final Database database;
|
||||
|
||||
public DatabaseDao(Database database) {
|
||||
this.database = database;
|
||||
}
|
||||
|
||||
public List<Task> toList(Query query) {
|
||||
return query(query).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a query with SQL DSL objects
|
||||
*/
|
||||
public TodorooCursor query(Query query) {
|
||||
query.from(table);
|
||||
String queryString = query.toString();
|
||||
if (BuildConfig.DEBUG) {
|
||||
Timber.v(queryString);
|
||||
}
|
||||
Cursor cursor = database.rawQuery(queryString);
|
||||
return new TodorooCursor(cursor, query.getFields());
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the given id
|
||||
* @return true if delete was successful
|
||||
*/
|
||||
public boolean delete(long id) {
|
||||
return database.delete(table.name,
|
||||
AbstractModel.ID_PROPERTY.eq(id).toString(), null) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all matching a clause
|
||||
* @param where predicate for deletion
|
||||
* @return # of deleted items
|
||||
*/
|
||||
public int deleteWhere(Criterion where) {
|
||||
Timber.v("deleteWhere(%s)", where);
|
||||
return database.delete(table.name,
|
||||
where.toString(), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update all matching a clause to have the values set on template object.
|
||||
* <p>
|
||||
* Example (updates "joe" => "bob" in metadata value1):
|
||||
* {code}
|
||||
* Metadata item = new Metadata();
|
||||
* item.setVALUE1("bob");
|
||||
* update(item, Metadata.VALUE1.eq("joe"));
|
||||
* {code}
|
||||
* @param where sql criteria
|
||||
* @param template set fields on this object in order to set them in the db.
|
||||
* @return # of updated items
|
||||
*/
|
||||
public int update(Criterion where, Task template) {
|
||||
return database.update(table.name, template.getSetValues(),
|
||||
where.toString());
|
||||
}
|
||||
|
||||
private interface DatabaseChangeOp {
|
||||
boolean makeChange();
|
||||
}
|
||||
|
||||
private boolean insertOrUpdateAndRecordChanges(Task item, DatabaseChangeOp op) {
|
||||
final AtomicBoolean result = new AtomicBoolean(false);
|
||||
synchronized(database) {
|
||||
result.set(op.makeChange());
|
||||
if (result.get()) {
|
||||
item.markSaved();
|
||||
if (BuildConfig.DEBUG) {
|
||||
Timber.v("%s %s", op, item.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the given item.
|
||||
* @param item
|
||||
* item model
|
||||
* @return returns true on success.
|
||||
*/
|
||||
public boolean createNew(final Task item) {
|
||||
if (!item.containsValue(Task.UUID) || Task.isUuidEmpty(item.getUuid())) {
|
||||
item.setUuid(UUIDHelper.newUUID());
|
||||
}
|
||||
|
||||
DatabaseChangeOp insert = new DatabaseChangeOp() {
|
||||
@Override
|
||||
public boolean makeChange() {
|
||||
ContentValues mergedValues = item.getMergedValues();
|
||||
mergedValues.remove(AbstractModel.ID_PROPERTY.name);
|
||||
long newRow = database.insert(table.name, mergedValues);
|
||||
boolean result = newRow >= 0;
|
||||
if (result) {
|
||||
item.setId(newRow);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "INSERT";
|
||||
}
|
||||
};
|
||||
return insertOrUpdateAndRecordChanges(item, insert);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the given item. Will not create a new item!
|
||||
* @param item
|
||||
* item model
|
||||
* @return returns true on success.
|
||||
*/
|
||||
public boolean saveExisting(final Task item) {
|
||||
final ContentValues values = item.getSetValues();
|
||||
if(values == null || values.size() == 0) // nothing changed
|
||||
{
|
||||
return true;
|
||||
}
|
||||
DatabaseChangeOp update = new DatabaseChangeOp() {
|
||||
@Override
|
||||
public boolean makeChange() {
|
||||
return database.update(table.name, values,
|
||||
AbstractModel.ID_PROPERTY.eq(item.getId()).toString()) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "UPDATE";
|
||||
}
|
||||
};
|
||||
return insertOrUpdateAndRecordChanges(item, update);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue