package com.pinecome.technology.mcommerce.learning.android.chaper08;
import java.util.HashMap;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import com.pinecone.technology.mcommerce.learning.android.chapter07.sqlite.DatabaseHelper;
public class StudentsProvider extends ContentProvider {
private static final String STUDENT_TABLE = "students";
private static final String DEPARTMENT_TABLE = "departments";
private static final int STUDENTS = 1;
private static final int STUDENT_ID = 2;
private static final int DEPARTMENTS = 3;
private static final int DEPARTMENT_ID = 4;
private static final UriMatcher MATCHER;
private static final String TAG = "StudentsProvider";
private DatabaseHelper dbHelper = null;
static {
MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
MATCHER.addURI(StudentsContract.AUTHORITY, "students", STUDENTS);
MATCHER.addURI(StudentsContract.AUTHORITY, "students/#", STUDENT_ID);
MATCHER.addURI(StudentsContract.AUTHORITY, "departments", DEPARTMENTS);
MATCHER.addURI(StudentsContract.AUTHORITY, "departments/#",
DEPARTMENT_ID);
}
private static HashMap<String, String> sStudentProjectionMap;
static {
sStudentProjectionMap = new HashMap<String, String>();
sStudentProjectionMap.put(StudentsContract.Student._ID,
StudentsContract.Student._ID);
sStudentProjectionMap.put(StudentsContract.Student.NAME,
StudentsContract.Student.NAME);
sStudentProjectionMap.put(StudentsContract.Student.AGE,
StudentsContract.Student.AGE);
sStudentProjectionMap.put(StudentsContract.Department.NAME,
StudentsContract.Department.NAME);
}
@Override
public boolean onCreate() {
Log.d("Provider", "onCreate");
dbHelper = new DatabaseHelper(getContext());
return ((dbHelper == null) ? false : true);
}
/**
* Return the MIME type of the data at the given URI. This should start with
* "vnd.android.cursor.item" for a single record, or
* "vnd.android.cursor.dir" for multiple items. This method can be called
* from multiple threads, as described in
*/
@Override
public String getType(Uri url) {
final int match = MATCHER.match(url);
switch (match) {
case STUDENTS:
return StudentsContract.Student.CONTENT_TYPE;
case STUDENT_ID:
return StudentsContract.Student.CONTENT_ITEM_TYPE;
case DEPARTMENTS:
return StudentsContract.Department.CONTENT_TYPE;
case DEPARTMENT_ID:
return StudentsContract.Department.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unsupported URI: " + url);
}
}
@Override
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
Log.d(TAG, "query");
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
Cursor c = null;
String orderBy = null;
switch (MATCHER.match(url)) {
case STUDENTS:
qb.setTables(STUDENT_TABLE);
qb.setProjectionMap(sStudentProjectionMap);
if (TextUtils.isEmpty(sort)) {
orderBy = StudentsContract.Student.DEFAULT_STUDENT_SORT_ORDER;
} else {
orderBy = sort;
}
break;
case STUDENT_ID:
qb.setTables(STUDENT_TABLE);
qb.setProjectionMap(sStudentProjectionMap);
qb.appendWhere(StudentsContract.Student._ID + "="
+ url.getPathSegments().get(1));
break;
case DEPARTMENTS:
qb.setTables(DEPARTMENT_TABLE);
qb.setProjectionMap(sStudentProjectionMap);
if (TextUtils.isEmpty(sort)) {
orderBy = StudentsContract.Department.DEFAULT_DEPARTMENT_SORT_ORDER;
} else {
orderBy = sort;
}
break;
case DEPARTMENT_ID:
qb.setTables(DEPARTMENT_TABLE);
qb.setProjectionMap(sStudentProjectionMap);
qb.appendWhere(StudentsContract.Department._ID + "="
+ url.getPathSegments().get(1));
break;
}
c = qb.query(dbHelper.getReadableDatabase(), projection, selection,
selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), url);
return (c);
}
@Override
public Uri insert(Uri url, ContentValues initialValues) {
if (MATCHER.match(url) != STUDENTS) {
throw new IllegalArgumentException("Unknown URI " + url);
}
if (initialValues.containsKey(StudentsContract.Student.NAME) == false) {
throw new SQLException(
"Failed to insert row because Book Name is needed " + url);
}
long rowID = dbHelper.getWritableDatabase().insert(STUDENT_TABLE,
StudentsContract.Student.NAME, initialValues);
if (rowID > 0) {
Uri uri = ContentUris.withAppendedId(
StudentsContract.Student.CONTENT_URI, rowID);
getContext().getContentResolver().notifyChange(uri, null);
return (uri);
}
throw new SQLException("Failed to insert row into " + url);
}
@Override
public int delete(Uri url, String where, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count;
switch (MATCHER.match(url)) {
case STUDENTS:
count = db.delete(STUDENT_TABLE, where, whereArgs);
break;
case STUDENT_ID:
String rowId = url.getPathSegments().get(1);
count = db.delete(
STUDENT_TABLE,
StudentsContract.Student._ID
+ "="
+ rowId
+ (!TextUtils.isEmpty(where) ? " AND (" + where
+ ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + url);
}
getContext().getContentResolver().notifyChange(url, null);
return (count);
}
@Override
public int update(Uri url, ContentValues values, String where,
String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count;
switch (MATCHER.match(url)) {
case STUDENTS:
count = db.update(STUDENT_TABLE, values, where, whereArgs);
break;
case STUDENT_ID:
String rowId = url.getPathSegments().get(1);
count = db.update(
STUDENT_TABLE,
values,
StudentsContract.Student._ID
+ "="
+ rowId
+ (!TextUtils.isEmpty(where) ? " AND (" + where
+ ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + url);
}
count = dbHelper.getWritableDatabase().update(STUDENT_TABLE, values,
where, whereArgs);
getContext().getContentResolver().notifyChange(url, null);
return (count);
}
}