1ContentProvider 是共享数据
2ContentObserver是监听数据
3ContentObserver是解析数据
这个是测试程序,是用来接收另一个程序的信息
public class TestContent extends AndroidTestCase{
public void testInsert(){
ContentResolver resolver = getContext().getContentResolver();
Uri uri= Uri.parse("content://Itheima/account");
ContentValues values = new ContentValues();
values.put("name", "李仕保s");
values.put("balance", 2000);
System.out.println(resolver.insert(uri, values));
}
public void testDelete(){
ContentResolver resolver = getContext().getContentResolver();
Uri uri= Uri.parse("content://Itheima/account/12");
resolver.delete(uri, null,null);//delete(uri, 条件,参数)
}
public void testUpdate(){
ContentResolver rsolver = getContext().getContentResolver();
Uri uri= Uri.parse("content://Itheima/account/13");
ContentValues values = new ContentValues();
values.put("name", "曾经");
values.put("balance", 1222);
rsolver.update(uri, values, null, null);
}
public void testFindByid(){
ContentResolver resolver = getContext().getContentResolver();
Uri uri= Uri.parse("content://Itheima/account/13");
Cursor c= resolver.query(uri, null, null, null, null);
while(c.moveToNext()){
System.out.println("name"+c.getString(c.getColumnIndex("name"))+
"balance"+c.getInt(c.getColumnIndex("balance")));
}
}
public void testGetType(){
System.out.println(Uri.parse("content://Itheima/account/13"));
System.out.println(Uri.parse("content://Itheima/account/13"));
}
}
这个是存数据的程序 ,是送到上面去的。
public class ItheimaProvider extends ContentProvider{
private MyHelper helper;
private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);//创建这uri匹配器的时值默认是-1
private final int Account = 1;
private final int Account_Id=0;
@Override
public boolean onCreate() {
helper = new MyHelper(getContext());
//Itheima是主机名,account是数据的名,Account是条件1
//content://Itheima/account/id
matcher.addURI("Itheima", "account", Account); //如果传进来的uri后面所带的名表是account,哪匹配器是1
matcher.addURI("Itheima", "account/#", Account_Id);//#号是通配符id,如果这uri有带id,哪就匹配器的值就是0
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
MyHelper helper= new MyHelper(getContext());
SQLiteDatabase db = helper.getReadableDatabase();//这里用getWritableDatabase()也没有什么大问题。
switch (matcher.match(uri)) {
case Account_Id:
long id = ContentUris.parseId(uri);
selection="_id=?";
selectionArgs=new String[]{id+""};
case Account:
//db.query( 表名, 列名, 条件, 参数, groupBy, having, orderBy);
Cursor c = db.query("account", projection, selection, selectionArgs, null, null, sortOrder);
return c;
default:
throw new IllegalArgumentException("URI无法识别");
}
}
@Override
public String getType(Uri uri) {
switch (matcher.match(uri)) { // 获取Uri的MimeType, text/html text/css 格式
case Account_Id:
return "vnd.android.cursor.item"; //返回一条记录用这个标记
case Account:
return "vnd.android.cursor.dir"; //返回多条记录用这个标记
default:
throw new IllegalArgumentException("URI无法识别");
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = helper.getWritableDatabase();
switch (matcher.match(uri)) {
case Account:
long id = db.insert("account", "_id", values);
db.close();
return ContentUris.withAppendedId(uri, id);
default:
throw new IllegalArgumentException("URI无法识别");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = helper.getWritableDatabase();
switch (matcher.match(uri)) {
case Account_Id:
long id = ContentUris.parseId(uri);
selection="_id=?";
selectionArgs=new String[]{id+""};
case Account:
int count = db.delete("account", selection, selectionArgs);
db.close();
return count;
default:
throw new IllegalArgumentException("URI无法识别");
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
MyHelper helper = new MyHelper(getContext());
switch (matcher.match(uri)) {
case Account_Id://这个是有ID的uri
long id = ContentUris.parseId(uri);
selection="_id=?";
selectionArgs=new String[]{id+""};
case Account://这个是没有id的uri
SQLiteDatabase db = helper.getWritableDatabase();
int count = db.update("account", values, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null); // 当数据改变时, 发送通知, 这时ContentObserver就会接收到
db.close();
return count;
default:
throw new IllegalArgumentException("URI无法识别");
}
}
}
清单文件也有注意
<provider
android:name="com.itheima.sqlite.provider.ItheimaProvider"
android:authorities="ItheimaProvider"
android:exported="true" />
这里是刷新页面
// 注册一个ContentObserver(类似一个监听器), 其中需要实现onChange()方法, 在数据修改的时候, 会自动执行onChange()方法
Uri uri = Uri.parse("content://ItheimaProvider");
getContentResolver().registerContentObserver(uri , true, new MyObserver()); //这里的true是监听uri下所有的子路径,如果是假只会监听当前uri
private class MyObserver extends ContentObserver {
public MyObserver() {
super(new Handler());
}
public void onChange(boolean selfChange) {
list = dao.queryPage(20, pageNum); // 重新查询数据
adapter.notifyDataSetChanged(); // 刷新ListView(把数据和ListView显示的内容同步)
}
}