创建内容提供者
2017-07-15 16:57 烈'焰 阅读(413) 评论(0) 编辑 收藏 举报如果要使用内容提供者就要继承ContentProvider,并且重写了onCreate(),insert(),query(),updata(),delete(),getType()方法,
onCreate()完成对数据库的创建和升级,返回true表示成功,
query():使用uri参数来确定查询那个表,projection 那一列,selection和selectionArgs 参数用于约束那些行,sortOrder对结果进行排序,返回值放到Cursor对象中返回
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
getType()方法根据传入内容 的URI来返回相应的MIME类型。如果是单条数据,那么我们的MIME类型应该以vnd.android.cursor.item开头,如果是多条数据,我们的MIME类型的数据应该以vnd.android.cursor.dir开头。
public String getType(Uri uri) { switch (uriMatcher.match(uri)){ case BOOK_DIR://查询多行 return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Book"; case BOOK_ITEM://查询单行 return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Book"; case CATEGORY_DIR: return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Category"; case CATEGORY_ITEM: return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Category"; } return null; }
创建内容提供者,创建一个类继承ContentProvider
在定义两个常量,分别表示执行单行还是多行。
接下来在静态代码块中创建UriMatcher实例,并且调用addURI()方法,将我们期望的值传进来。UriMatcher主要用在ContentProvider中,用来判断Uri的正确性,如在insert之前先判断用户传进来的Uri是否与UriMatcher定义的匹配。
public static final int BOOK_DIR=0; public static final int BOOK_ITEM = 1; public static final String AUTHORITY ="com.example.a13522.provider"; private static UriMatcher uriMatcher; private MyDatabaseHelper dbHelper; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//NO_MATCH是Uri不匹配时返回的code uriMatcher.addURI(AUTHORITY,"Book",BOOK_DIR); uriMatcher.addURI(AUTHORITY,"Book/#",BOOK_ITEM);
在onCreate()方法中创建数据库
public boolean onCreate() { dbHelper = new MyDatabaseHelper(getContext(),"BookStore.db",null,2); return false; }
在query()方法中进行查询
首先用SQLiteDatabase 调用我们创建的MyDatabaseHelper类获取getReadeableDatabase()方法读取数据库
然后创建Cursor实例将得到的数据保存到Cursor中
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = null; switch (uriMatcher.match(uri)) {//对传入对象进行匹配 case BOOK_DIR://查询所有信息 cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder); break; case BOOK_ITEM://查询单行数据 String bookId = uri.getPathSegments().get(1); cursor = db.query("Book", projection, "price=?", new String[]{bookId}, null, null, sortOrder); break; default: break; } return cursor; }
insert()插入信息
首先添加数据库,通过数据库向表中插入数据,并且得到插入的uri
public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Uri uriReturn = null; switch (uriMatcher.match(uri)){ case BOOK_DIR: case BOOK_ITEM: long newBookId = db.insert("Book",null,values); uriReturn = Uri.parse("content//"+AUTHORITY+"/Book/"+newBookId); break;
default:break; } return uriReturn; }
updata()更新数据
1.添加数据库,利用数据库掉用更新的方法,并且获取它受影响的行数
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getReadableDatabase(); int update = 0;//更新行数 switch (uriMatcher.match(uri)){ case BOOK_DIR: update = db.update("Book",values,selection,selectionArgs); break; case BOOK_ITEM: String bookId= uri.getPathSegments().get(1); update = db.update("Book",values,"price=?",new String[]{bookId}); break; } return update; }
delete()删除数据库
1.添加数据库,利用数据库调用删除方法,并且返回受影响的行数
public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getReadableDatabase(); int delectData = 0; switch (uriMatcher.match(uri)){ case BOOK_DIR: delectData= db.delete("Book",selection,selectionArgs); break; case BOOK_ITEM: String bookId= uri.getPathSegments().get(1); db.delete("Book","price=?",new String[]{bookId}); break; default:break; }
最后添加getType()方法
public String getType(Uri uri) { switch (uriMatcher.match(uri)){ case BOOK_DIR: return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Book"; case BOOK_ITEM: return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Book"; case CATEGORY_DIR: return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Category"; case CATEGORY_ITEM: return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Category"; } return null;