1,建立一个属于自己的content provider你必须要做
- 设置一个存储数据的地方,可以使用android 提供的文件存储方法,或者使用sqlite databases,然而,你可以存储任何你想要的数据,android提供的sqliteOpenHelper可以帮助你创建属于和管理你自己的数据库,
- 实现ContentProvider 提供用于访问数据的类
- 在AndroidManifest.xml,声明你的 content provider
2,编写一个数据工具类
- @H_404_143@publicclassContentProviderData{
- @H_404_143@public@H_404_143@staticfinalStringAUTHORIY="kg.tom.FirstProvider";
- @H_404_143@publicclassContentProviderData{
- //定义我们provider使用的认证uri
- @H_404_143@public@H_404_143@staticfinalStringAUTHORIY="kg.tom.FirstProvider";
- //定义我们数据库的名字
- @H_404_143@public@H_404_143@staticfinalStringDATABASE_NAME="kg_tom_pro_test";
- //定义数据库的版本号
- @H_404_143@public@H_404_143@staticfinal@H_404_143@intDATABASE_VERSION=1;
- //定义创建表的名字
- @H_404_143@public@H_404_143@staticfinalStringUSERS_TABLE_NAME="users";
- //实现BaseColums,自带两列,_id,_count
- @H_404_143@public@H_404_143@staticfinalclassUserTableMetaDataimplementsBaseColumns{
- //定义创建表的名字
- @H_404_143@public@H_404_143@staticfinalStringTABLE_NAME="users";
- //定义provider的uri
- @H_404_143@public@H_404_143@staticfinalUriCONTENT_URI=Uri.parse("content://"+AUTHORIY+"/users");
- //定义一条数据的类型
- @H_404_143@public@H_404_143@staticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/vnd.firstprovider.user";
- //定义一组数据的类型
- @H_404_143@public@H_404_143@staticfinalStringCONTENT_TYPE_ITEM="vnd.android.cursor.item/vnd.fiRSStprovider.user";
- //定义列名
- @H_404_143@public@H_404_143@staticfinalStringUSER_NAME="name";
- //定义排序规则
- @H_404_143@public@H_404_143@staticfinalStringDEFULT_SORT_ORDER="_iddesc";
- }}
2,继承content provider 类 继承这个类我们同时要实现以下几个方法: query() insert() update() delete() getType() onCreate() 还有必须添加一个UriMatcher对象 关于UriMatcher对象的使用文档有很好的解释
- //定义URI标识符,数值定义请参考文档
- @H_404_143@public@H_404_143@staticfinal@H_404_143@intINCOMING_USER_COLLECTION=1;
- @H_404_143@public@H_404_143@staticfinal@H_404_143@intINCOMING_USER_SINGLE=2;
- //定义UriMatcher对象
- @H_404_143@public@H_404_143@staticfinalUriMatcheruMatcher;
- //把标识符加入到URI中,固定写法
- @H_404_143@static{
- uMatcher=newUriMatcher(UriMatcher.NO_MATCH);
- //第一个参数为
- contentproviderauthoriy
- uMatcher.addURI(AUTHORIY,"users",INCOMING_USER_COLLECTION);
- uMatcher.addURI(AUTHORIY,"users/#",INCOMING_USER_SINGLE);}
一个完整的content provider
- @H_404_143@publicclassFirstProviderextendsContentProvider{
- //定义URI标识符
- @H_404_143@public@H_404_143@staticfinal@H_404_143@intINCOMING_USER_COLLECTION=1;
- @H_404_143@public@H_404_143@staticfinal@H_404_143@intINCOMING_USER_SINGLE=2;
- //定义UriMatcher对象
- @H_404_143@public@H_404_143@staticfinalUriMatcheruMatcher;
- //把标识符加入到URI中,固定写法
- @H_404_143@static{
- uMatcher=newUriMatcher(UriMatcher.NO_MATCH);uMatcher.addURI(ContentProviderData.AUTHORIY,INCOMING_USER_COLLECTION);
- uMatcher.addURI(ContentProviderData.AUTHORIY,INCOMING_USER_SINGLE);}
- //这里是定义查询用的列名的别名
- @H_404_143@public@H_404_143@staticHashMap<String,String>userMap;
- privateDataBaseHelperdh;
- @H_404_143@static{
- userMap=newHashMap<String,String>();
- userMap.put(UserTableMetaData._ID,"id");
- userMap.put(UserTableMetaData.USER_NAME,
- UserTableMetaData.USER_NAME);}
- @Override
- @H_404_143@public@H_404_143@int@H_404_143@delete(Uriuri,Stringselection,String[]selectionArgs){
- //TODOAuto-generatedmethodstub
- @H_404_143@return0;}
- //根据传入的URI
- @Override
- @H_404_143@publicStringgetType(Uriuri){
- //TODOAuto-generatedmethodstub
- Log.d("sqlite","getType-->");
- switch(uMatcher.match(uri)){
- caseINCOMING_USER_COLLECTION:
- @H_404_143@returnUserTableMetaData.CONTENT_TYPE;
- caseINCOMING_USER_SINGLE:
- @H_404_143@returnUserTableMetaData.CONTENT_TYPE_ITEM;@H_404_143@default:
- thrownewIllegalArgumentException("unKnownuri"+uri);}}
- @Override
- @H_404_143@publicUri@H_404_143@insert(Uriuri,ContentValues@H_404_143@values){
- //TODOAuto-generatedmethodstub
- Log.d("insert","class"+getClass());
- Log.d("insert","content"+getContext());
- sqliteDatabasedb=dh.getWritableDatabase();
- longrowId=db.@H_404_143@insert(UserTableMetaData.TABLE_NAME,@H_404_143@values);
- if(rowId>0){
- UriinsertUri=ContentUris.withAppendedId
- (UserTableMetaData.CONTENT_URI,rowId);
- getContext().getContentResolver().notifyChange(insertUri,null);
- @H_404_143@returninsertUri;}
- @H_404_143@returnnull;}
- @Override
- @H_404_143@publicbooleanonCreate(){
- //TODOAuto-generatedmethodstub
- Log.d("sqlite","createPro--->");
- dh=newDataBaseHelper(getContext(),ContentProviderData.DATABASE_NAME);
- //sqliteDatabasedb=dh.getReadableDatabase();@H_404_143@return@H_404_143@true;}
- @Override
- @H_404_143@public@H_404_143@Cursorquery(Uriuri,String[]projection,
- String[]selectionArgs,StringsortOrder){
- //TODOAuto-generatedmethodstub
- sqliteQueryBuilderqb=newsqliteQueryBuilder();
- switch(uMatcher.match(uri)){
- caseINCOMING_USER_COLLECTION:
- qb.setTables(UserTableMetaData.TABLE_NAME);
- qb.setProjectionMap(userMap);
- break;
- caseINCOMING_USER_SINGLE:
- qb.setTables(UserTableMetaData.TABLE_NAME);
- qb.setProjectionMap(userMap);
- qb.appendWhere(UserTableMetaData._ID+"="+
- uri.getPathSegments().get(1));
- break;}
- StringorderBy;
- if(TextUtils.isEmpty(sortOrder)){
- orderBy=UserTableMetaData.DEFULT_SORT_ORDER;}@H_404_143@else{
- orderBy=sortOrder;}
- sqliteDatabasedb=dh.getWritableDatabase();
- @H_404_143@Cursorc=qb.query(db,projection,selection,
- selectionArgs,sortOrder);
- c.setNotificationUri(getContext().getContentResolver(),uri);
- Log.d("sqlite","first--->>");@H_404_143@returnc;}
- @Override
- @H_404_143@public@H_404_143@int@H_404_143@update(Uriuri,ContentValues@H_404_143@values,
- String[]selectionArgs){
- //TODOAuto-generatedmethodstub
- @H_404_143@return0;}}
3,在activity中的方法中用上这几行代码就可以进行插入
- //定义插入用数据的对象,本质是一个
- mapContentValues@H_404_143@values=newContentValues();
- //键,值对@H_404_143@values.put("id",1);
- //定义表名
- String@H_404_143@name=ContentProviderData.USERS_TABLE_NAME;
- //键值对
- @H_404_143@values.put(ContentProviderData.UserTableMetaData.USER_NAME,"tom");
- //进行contentprovider的插入操作
- Uriuri=getContentResolver().@H_404_143@insert(
- ContentProviderData.UserTableMetaData.CONTENT_URI,@H_404_143@values);
至于剩下的 query() delete() 自己参照文档补全吧 |