package jp.mixi.sample.test; import android.annotation.SuppressLint; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.provider.BaseColumns; import android.util.Log; /** * テキストを保存するための DB への窓口の ContentProvider * PK: _id * カラム: name * * @author keishin.yokomaku * */ public class TestTargetContentProvider extends ContentProvider { public static final String AUTHORITY = "jp.mixi.sample.test.testtargetcontentprovider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/tests"); public static final String TAG = TestTargetContentProvider.class.getSimpleName(); private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final String CONTENT_TYPE_TEST_ITEMS = "vnd.android.cursor.dir/vnd.mixi.test"; private static final String CONTENT_TYPE_TEST_ITEM = "vnd.android.cursor.item/vnd.mixi.test"; private static final int TYPE_ITEMS = 1; private static final int TYPE_ITEM = 2; private SQLiteOpenHelper mDatabaseHelper; // static initializer, which should be run at class loading static { URI_MATCHER.addURI(AUTHORITY, "tests", TYPE_ITEMS); URI_MATCHER.addURI(AUTHORITY, "tests/#", TYPE_ITEM); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = null; try { String newSelection = buildSelection(uri, selection); db = mDatabaseHelper.getWritableDatabase(); db.beginTransaction(); final int count = db.delete("tests", newSelection, selectionArgs); db.setTransactionSuccessful(); return count; } finally { if (db != null) { db.endTransaction(); } } } @Override public String getType(Uri uri) { switch (URI_MATCHER.match(uri)) { case TYPE_ITEM: return CONTENT_TYPE_TEST_ITEM; case TYPE_ITEMS: return CONTENT_TYPE_TEST_ITEMS; default: throw new IllegalArgumentException("unknown uri: " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { if (URI_MATCHER.match(uri) != TYPE_ITEMS) { throw new IllegalArgumentException("unable to insert with this uri: " + uri); } SQLiteDatabase db = null; try { db = mDatabaseHelper.getWritableDatabase(); db.beginTransaction(); final long id = db.insertOrThrow("tests", null, values); Uri newUri = ContentUris.withAppendedId(uri, id); db.setTransactionSuccessful(); return newUri; } finally { if (db != null) { db.endTransaction(); } } } @Override public boolean onCreate() { mDatabaseHelper = new MyDatabaseHelper(getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = null; final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); String newSelection = buildSelection(uri, selection); queryBuilder.setTables("tests"); Cursor c = null; try { db = mDatabaseHelper.getReadableDatabase(); c = queryBuilder.query(db, projection, newSelection, selectionArgs, null, null, sortOrder); return c; } catch (RuntimeException e) { if (c != null) { c.close(); } if (db != null) { db.close(); } throw e; } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = null; try { db = mDatabaseHelper.getWritableDatabase(); db.beginTransaction(); String newSelection = buildSelection(uri, selection); int count = db.update("tests", values, newSelection, selectionArgs); db.setTransactionSuccessful(); return count; } finally { if (db != null) { db.endTransaction(); } } } private String buildSelection(Uri uri, String selection) { long id = 0; String additionalSelection = null; switch (URI_MATCHER.match(uri)) { case TYPE_ITEM: id = ContentUris.parseId(uri); additionalSelection = BaseColumns._ID + " = " + id; break; case TYPE_ITEMS: // do nothing break; default: throw new IllegalArgumentException("unknown uri: " + uri); } if (additionalSelection == null) { return selection; } if (selection == null) { return additionalSelection; } return additionalSelection + " AND " + selection; } @SuppressLint("NewApi") @Override public void shutdown() { mDatabaseHelper.close(); super.shutdown(); } public static class MyDatabaseHelper extends SQLiteOpenHelper { public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "tests.db"; public static final String CREATE_TABLE_SQL = "CREATE TABLE tests(" + BaseColumns._ID +" INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL)"; public static final String DROP_TABLE_SQL = "DROP TABLE tests;"; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); Log.v(TAG, "construct"); } @Override public void onCreate(SQLiteDatabase db) { Log.v(TAG, "onCreate"); createTable(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.v(TAG, "onUpgrade"); dropTable(db); createTable(db); } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.v(TAG, "onDowngrade"); dropTable(db); createTable(db); } private void createTable(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_SQL); } private void dropTable(SQLiteDatabase db) { db.execSQL(DROP_TABLE_SQL); } } }