package com.base.db; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.Log; import com.base.bean.BaseBean; public abstract class IssContentProvider extends ContentProvider { public static String CONTENT_TYPE = "vnd.android.cursor.dir/iss.db"; protected SQLiteDatabase mDB; public static String AUTHORITY = "com.iss.mobile"; @Override public boolean onCreate() { Log.i("liaowenxin", "contentprovider onCreate"); init(); IssDBFactory issDBFactory = IssDBFactory.getInstance(); DBConfig config = IssDBFactory.getInstance().getDBConfig(); if (config == null) { throw new RuntimeException("db factory not init"); } AUTHORITY = config.authority; CONTENT_TYPE = "vnd.android.cursor.dir/" + config.dbName; mDB = issDBFactory.open(); return true; } public abstract void init(); public static final String SCHEME = "content"; @Override public Uri insert(Uri uri, ContentValues values) { String tableName = getTableName(uri); long result = mDB.insert(tableName, null, values); if (result != -1) { getContext().getContentResolver().notifyChange(uri, null); } return buildResultUri(tableName, result); } @Override public int bulkInsert(Uri uri, ContentValues[] values) { mDB.beginTransaction(); String tableName = getTableName(uri); for(ContentValues value:values){ mDB.insert(tableName, null, value); } mDB.setTransactionSuccessful(); mDB.endTransaction(); return values.length; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String tableName = getTableName(uri); return mDB.query(tableName, projection, selection, selectionArgs, null, null, sortOrder); } @Override public String getType(Uri uri) { return CONTENT_TYPE; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { String tableName = getTableName(uri); int result = mDB.delete(tableName, selection, selectionArgs); if (result != 0) { getContext().getContentResolver().notifyChange(uri, null); } return result; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { String tableName = getTableName(uri); int result = mDB.update(tableName, values, selection, selectionArgs); if (result != 0) { getContext().getContentResolver().notifyChange(uri, null); } return result; } private Uri buildResultUri(String tableName, long result) { final Uri.Builder builder = new Uri.Builder(); DBConfig config = IssDBFactory.getInstance().getDBConfig(); if (config == null) { throw new RuntimeException("db factory not init"); } builder.scheme(SCHEME); builder.authority(config.authority); builder.path(tableName); builder.appendPath(String.valueOf(result)); return builder.build(); } private String getTableName(Uri uri) { DBConfig config = IssDBFactory.getInstance().getDBConfig(); if (config == null) { throw new RuntimeException("db factory not init"); } String path = uri.getLastPathSegment(); if (!config.tableNameList.contains(path)) { throw new IllegalArgumentException("Unknown URI " + uri); } return path; } public static Uri buildUri(String path, String id) { final Uri.Builder builder = new Uri.Builder(); DBConfig config = IssDBFactory.getInstance().getDBConfig(); if (config == null) { throw new RuntimeException("db factory not init"); } builder.scheme(SCHEME); builder.authority(config.authority); builder.path(path); builder.appendPath(id); return builder.build(); } public static Uri buildUri(String path) { final Uri.Builder builder = new Uri.Builder(); DBConfig config = IssDBFactory.getInstance().getDBConfig(); if (config == null) { throw new RuntimeException("db factory not init"); } builder.scheme(SCHEME); builder.authority(config.authority); builder.path(path); return builder.build(); } public static Uri buildUri(Class<? extends BaseBean<?>> c) { final String tableName = TableUtil.getTableName(c); return buildUri(tableName); } }