package com.distantfuture.videos.database;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.distantfuture.videos.misc.DUtils;
import com.distantfuture.videos.services.ListServiceRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DatabaseAccess {
private Database mDB;
private DatabaseTables.DatabaseTable mTable;
private String mRequestIdentifier;
private Context mContext;
public DatabaseAccess(Context context, ListServiceRequest request) {
this(context, request.databaseTable());
}
public DatabaseAccess(Context context, DatabaseTables.DatabaseTable table) {
super();
mDB = Database.instance(context);
mContext = context.getApplicationContext();
mTable = table;
}
public void deleteAllRows(String requestIdentifier) {
SQLiteDatabase db = mDB.getWritableDatabase();
try {
Database.DatabaseQuery queryParams = mTable.queryParams(DatabaseTables.ALL_ITEMS, requestIdentifier, null);
int result = db.delete(mTable.tableName(), queryParams.mSelection, queryParams.mSelectionArgs);
if (result > 0)
notifyProviderOfChange();
} catch (Exception e) {
DUtils.log("deleteAllRows exception: " + e.getMessage());
}
}
public void deleteItem(Long id) {
SQLiteDatabase db = mDB.getWritableDatabase();
try {
int result = db.delete(mTable.tableName(), whereClauseForID(), whereArgsForID(id));
if (result > 0)
notifyProviderOfChange();
} catch (Exception e) {
DUtils.log("deleteItem exception: " + e.getMessage());
}
}
public void insertItems(List<YouTubeData> items) {
if (items != null) {
// Gets the data repository in write mode
SQLiteDatabase db = mDB.getWritableDatabase();
db.beginTransaction();
try {
for (YouTubeData item : items)
db.insert(mTable.tableName(), null, mTable.contentValuesForItem(item));
db.setTransactionSuccessful();
notifyProviderOfChange();
} catch (Exception e) {
DUtils.log("Insert item exception: " + e.getMessage());
} finally {
db.endTransaction();
}
}
}
public YouTubeData getItemWithID(Long id) {
YouTubeData result = null;
Database.DatabaseQuery query = new Database.DatabaseQuery(mTable.tableName(), whereClauseForID(), whereArgsForID(id), mTable
.defaultProjection(), mTable.orderBy());
Cursor cursor = mDB.getCursor(query);
if (cursor.moveToFirst()) {
result = mTable.cursorToItem(cursor, null);
} else {
DUtils.log("getItemWithID not found or too many results?");
}
cursor.close();
return result;
}
public Cursor getCursor(int flags, String requestIdentifier) {
Database.DatabaseQuery query = mTable.queryParams(flags, requestIdentifier, null);
return mDB.getCursor(query);
}
public Cursor getCursor(String selection, String[] selectionArgs, String[] projection) {
Database.DatabaseQuery query = new Database.DatabaseQuery(mTable.tableName(), selection, selectionArgs, projection, mTable
.orderBy());
return mDB.getCursor(query);
}
public List<YouTubeData> getItems(int flags, String requestIdentifier, int maxResults) {
Cursor cursor = getCursor(flags, requestIdentifier);
List<YouTubeData> result = getItems(cursor, maxResults);
cursor.close();
return result;
}
public void updateItems(List<YouTubeData> items) {
SQLiteDatabase db = mDB.getWritableDatabase();
try {
for (YouTubeData theItem : items) {
int result = db.update(mTable.tableName(), mTable.contentValuesForItem(theItem), whereClauseForID(), whereArgsForID(theItem.mID));
if (result != 1)
DUtils.log("updateItem didn't return 1");
}
notifyProviderOfChange();
} catch (Exception e) {
DUtils.log("updateItem exception: " + e.getMessage());
}
}
public void updateItem(YouTubeData item) {
updateItems(Arrays.asList(item));
}
// -----------------------------------------------------------------------------
// private
private void notifyProviderOfChange() {
mContext.getContentResolver().notifyChange(YouTubeContentProvider.contentsURI(mContext), null);
}
private String whereClauseForID() {
return "_id=?";
}
private String[] whereArgsForID(Long id) {
return new String[]{id.toString()};
}
// pass 0 to maxResults if you don't care
private List<YouTubeData> getItems(Cursor cursor, int maxResults) {
List<YouTubeData> result = new ArrayList<YouTubeData>();
boolean stopOnMaxResults = maxResults > 0;
try {
int cnt = 0;
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
result.add(mTable.cursorToItem(cursor, null));
if (stopOnMaxResults) {
if (++cnt == maxResults)
break;
}
cursor.moveToNext();
}
}
} catch (Exception e) {
DUtils.log("getItems exception: " + e.getMessage());
}
return result;
}
}