/* 创建我们的BookProvider,先对数据源进行处理,为下一步对provider提供的增删改查等接口进行准备,即先处理数据源,然后对数据源的I/O接口(provider)进行处理。 */public class BookProvider extends ContentProvider{
/* 步骤3: setup projection Map,将Provider对外开放的projection名字与内部数据源数据库的列名进行对应。通过HashMap将provider的对外公布名字(即projection)和实际数据源的内部名字进行映射。目的是提供一个稳定provider接口。当数据源发生变化时,例如变更了表格的列名,这是只需要修改相应的映射关系,仍能保持对外接口的一致,不影响通过provider访问数据的其他应用。同时也可用于消除起义,例如数据库列名为name,可以定义projection的名字为people.name。这个映射关系在QueryBuilder类,通过setProjectMap()设定,见query()的实现*/
private static HashMap<String,String> sBooksProjectionMap; static{
sBooksProjectionMap = new HashMap<String, String>();
sBooksProjectionMap.put(BookTableMetaData._ID, BookTableMetaData._ID);
sBooksProjectionMap.put(BookTableMetaData.BOOK_NAME, BookTableMetaData.BOOK_NAME);
sBooksProjectionMap.put(BookTableMetaData.BOOK_ISBN, BookTableMetaData.BOOK_ISBN);
sBooksProjectionMap.put(BookTableMetaData.BOOK_AUTHOR, BookTableMetaData.BOOK_AUTHOR);
sBooksProjectionMap.put(BookTableMetaData.CREATED_DATE, BookTableMetaData.CREATED_DATE);
sBooksProjectionMap.put(BookTableMetaData.MODIFIED_DATE, BookTableMetaData.MODIFIED_DATE);
}
/* 步骤1:对数据源进行处理,本例采用内部类方式。本例数据源采用SQLite,SQLite通过对SQLiteOpenHelper的继承来实现,可以参考Android学习笔记(四一):SQLite的使用 , 必须重写onCreate()和onUpgrade()以及构造函数 */
private class DatabaseBookHelper extends SQLiteOpenHelper{
/* 步骤1.1 重写构造函数,给出数据库信息 */
DatabaseBookHelper(Context context){
super(context,BookProviderMetaData.DATABASE_NAME,null,BookProviderMetaData.DATABASE_VERSION);
}
/* 步骤1.2:@Override onCreate(),通CREATE TABLE创建数据库的表格*/
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + BookProviderMetaData.BOOKS_TABLE_NAME + " ("
+ BookTableMetaData._ID + " INTEGER PRIMARY KEY,"
+ BookTableMetaData.BOOK_NAME + " TEXT,"
+ BookTableMetaData.BOOK_ISBN + " TEXT,"
+ BookTableMetaData.BOOK_AUTHOR + " TEXT,"
+ BookTableMetaData.CREATED_DATE + " INTEGER,"
+ BookTableMetaData.MODIFIED_DATE + " INTEGER"
+ ");");
}
/* 步骤1.3:@Override onUpgrade,当发现数据库的版本低于当前版本时,对数据库进行升级,本例将删除原来的 全部数据,重新建立新的表格*/
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + BookProviderMetaData.BOOKS_TABLE_NAME);
onCreate(db);
}
} //End of 步骤1
private DatabaseBookHelper mDataSource = null; //步骤2:设置并获取数据源对象
/* 步骤4:提供判读输入uri样式的机制。
* 通过UriMatch对input的Uri进行匹配,判断uri是否合法,是collection还是item
* 在uriMatch对象上通过addURI登记uri的样式和一个唯一的number,当匹配时,uriMatch将返回该number。*/
private static final UriMatcher sUriMatch;
// 定义匹配时返回的number,本例只有1个table,故有collection和item两种。
private static final int BOOK_COLLECTION_URI_INDICATOR = 1;
private static final int BOOK_ITEM_URI_INDICATION = 2;
static{
// UriMatther的创建函数可以含有如果既没有path_segment也没有authorities时返回的number。
// 此外如果不匹配,UriMatch也会返回NO_MATCH,本例也可以写成sUriMatch = new UriMatcher();
sUriMatch = new UriMatcher(UriMatcher.NO_MATCH);
// 登记uri的样式及其对应的number值
sUriMatch.addURI(BookProviderMetaData.AUTHORITY, "books", BOOK_COLLECTION_URI_INDICATOR);
sUriMatch.addURI(BookProviderMetaData.AUTHORITY, "books/#", BOOK_ITEM_URI_INDICATION);
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues initalValue) {
return null;
}
/* 步骤2:关联数据源,本例创建数据库的对象 */
public boolean onCreate() {
mDataSource = new DatabaseBookHelper(getContext()); return false;
}
@Override
public Cursor query(Uri uri, String[] protection, String selection, String[] selectionArgs, String order) {
return null;
}
@Override
public int update(Uri uri, ContentValues values, String whereClause, String[] whereArgs) {
return 0;
}
}
|