如果要使用内容提供者就要继承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;