内容加载器:主要实现不同程序之间的数据共享的功能
两种用法:
一种是使用现有的内容加载器来读取和操作相应程序中的数据
另一种是创建自己的内容加载器俩提供外部访问的接口
访问其他程序的数据:
当一个应用程序通过内容加载器提供了外部访问的接口
一定要用到ContentResolver类
ContentResolver:
获取实例 通过getContentResolver()获取
然后再调用其类下面的insert() update() delete() query()方法
如下面的案例:获取手机联系人
public class MainActivity extends Activity {
ListView contactsView;
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);
contactsView.setAdapter(adapter);
readContacts();
}
private void readContacts() {
Cursor cursor = null;
try {
//注意这里的Uri 一般Uri uri = Uri.parse("content://com.example.app.provider/table1");
//而这里是Android系统本身的uri
//故在AndroidManifest.xml要加入权限
cursor = getContentResolver(). query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(displayName + "\n" + number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
创建自定义的内容加载器:
我们在一个app1工程里创建一个MyContentProvider内容提供器
也就相当于创建了一个访问该程序数据的接口
然后再另一个app2里先新建个
Uri uri = Uri.parse(“content://com.example.app1name.provider/book”);
再调用getContentResolver().insert…..等方法;
getContentResolver()相当于获取到MyContentProvider对象
如案例访问数据库的操作:
//在一个工程中创建内容加载器
public class MyContentProvider extends ContentProvider {
private static final int BOOK_DIR=0;
private static final int BOOK_ITEM=1;
private static final int CATEGORY_DIR=2;
private static final int CATEGORY_ITEM=3;
private static final String ATHORITY ="com.baozhong.database.provider";
private static UriMatcher uriMatcher;
private MyDatabase dbHelper;
//public class MyDatabase extends SQLiteOpenHelper
//为内容加载器,可以设置要访问的内容
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(ATHORITY,"book" , BOOK_DIR);
uriMatcher.addURI(ATHORITY,"book/#" , BOOK_ITEM);
uriMatcher.addURI(ATHORITY,"category" , CATEGORY_DIR);
uriMatcher.addURI(ATHORITY,"category/#" ,CATEGORY_ITEM);
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
dbHelper = new MyDatabase(getContext(), "Book.db", null, 2);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
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, selection,
selectionArgs, null, null, sortOrder);
break;
case CATEGORY_DIR:
cursor = db.query("Category", projection, selection,
selectionArgs, null, null, sortOrder);
break;
case CATEGORY_ITEM:
String categoryid=uri.getPathSegments().get(1);
cursor = db.query("Category", projection, selection,
selectionArgs, null, null, sortOrder);
break;
default:
break;
}
return cursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
switch(uriMatcher.match(uri)){
case BOOK_DIR:
return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.book";
case BOOK_ITEM:
return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.book";
case CATEGORY_DIR:
return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.category";
case CATEGORY_ITEM:
return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.category";
default:
break;
}
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri urireturn =null;
switch(uriMatcher.match(uri)){
case BOOK_DIR:
case BOOK_ITEM:
long newBookId = db.insert("Book", null, values);
urireturn = Uri.parse("content://"+ATHORITY +"/book/"+newBookId);
break;
case CATEGORY_DIR:
case CATEGORY_ITEM:
long newcategoryId = db.insert("Category", null, values);
urireturn = Uri.parse("content://"+ATHORITY +"/book/"+newcategoryId);
break;
default:
break;
}
return urireturn;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deleteRows = 0;
switch(uriMatcher.match(uri)){
case BOOK_DIR:
deleteRows = db.delete("Book", selection, selectionArgs);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
deleteRows = db.delete("Book", "id=?", new String[] {bookId});
break;
case CATEGORY_DIR:
deleteRows = db.delete("Category", selection, selectionArgs);
break;
case CATEGORY_ITEM:
String categoryId = uri.getPathSegments().get(1);
deleteRows = db.delete("Book", "id=?", new String[] {categoryId});
break;
default:
break;
}
return deleteRows;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updateRows = 0;
switch(uriMatcher.match(uri)){
case BOOK_DIR:
updateRows = db.update("Book",values,selection,selectionArgs);
break;
case BOOK_ITEM:
String bookid = uri.getPathSegments().get(1);
updateRows = db.update("Book", values, "id=?", new String[]{bookid});
break;
case CATEGORY_DIR:
updateRows = db.update("Category",values,selection,selectionArgs);
break;
case CATEGORY_ITEM:
String categoryid = uri.getPathSegments().get(1);
updateRows = db.update("Category", values, "id=?", new String[]{categoryid});
break;
default:
break;
}
return updateRows;
}
}
//在另一个工程实现访问和操作
public class MainActivity extends Activity{
private String newId;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Button addData = (Button)findViewById(R.id.add);
addData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Uri uri =Uri.parse("content://com.baozhong.database.provider/book");
ContentValues values = new ContentValues();
values.put("name", "A Clash Of King");
values.put("author", "George Martin");
values.put("pages", 1040);
values.put("price", 40.55);
Log.d("Add", "B");
Uri newUri = getContentResolver().insert(uri, values);
newId = newUri.getPathSegments().get(1);
Log.d("newId", newId);
}
});
Button queryData =(Button)findViewById(R.id.query);
queryData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Uri uri = Uri.parse("content://com.baozhong.database.provider/book");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if(cursor!=null){
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Toast.makeText(MainActivity.this,
"name: "+name+" author: "+author+" pages: "+pages+" price: "+price,
Toast.LENGTH_SHORT).show();
}
cursor.close();
}
}
});
Button updateData = (Button)findViewById(R.id.update);
updateData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//有点不一样
Uri uri = Uri.parse("content:"
+ "//com.baozhong.database.provider/book/"+newId);
ContentValues values = new ContentValues();
values.put("name", "A storm of Sword");
values.put("pages",1216);
values.put("price", 24.05);
// Log.d("newId", newId);
getContentResolver().update(uri, values, null, null);
}
});
Button deleteData =(Button)findViewById(R.id.delete);
deleteData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Uri uri = Uri.parse("content://com.baozhong.database.provider/book/"+newId);
getContentResolver().delete(uri, null, null);
}
});
}
}
以上就实现了跨程序的自定义的内容提供器的访问