当前位置:   article > 正文

数据共享与访问_registercontentobserver

registercontentobserver

一、实验目标

  1. 了解ContentProvider、ContentResolver和ContentObserver之间的联系
  2. 掌握使用内容提供者对外暴露数据
  3. 掌握使用ContentResolver操作其他应用的数据
  4. 掌握使用ContentObserver监视并响应数据变化

二、实验过程

  1. 创建ContentObserverDB应用,并使用ContentProvider向外共享数据。

创建如下界面

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:tools="http://schemas.android.com/tools"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     android:background="@drawable/bg"
  7.     android:orientation="vertical"
  8.     tools:context=".MainActivity">
  9.     <Button
  10.         android:id="@+id/btn_insert"
  11.         android:layout_width="120dp"
  12.         android:layout_height="40dp"
  13.         android:layout_marginLeft="40dp"
  14.         android:layout_marginTop="30dp"
  15.         android:background="@drawable/btn_bg"
  16.         android:textColor="#006000"
  17.         android:text="添加"
  18.         android:textSize="20dp"/>
  19.     <Button
  20.         android:id="@+id/btn_update"
  21.         android:layout_width="120dp"
  22.         android:layout_height="40dp"
  23.         android:layout_marginLeft="80dp"
  24.         android:layout_marginTop="30dp"
  25.         android:background="@drawable/btn_bg"
  26.         android:textColor="#006000"
  27.         android:text="更新"
  28.         android:textSize="20dp"/>
  29.     <Button
  30.         android:id="@+id/btn_delete"
  31.         android:layout_width="120dp"
  32.         android:layout_height="40dp"
  33.         android:layout_marginLeft="120dp"
  34.         android:layout_marginTop="30dp"
  35.         android:background="@drawable/btn_bg"
  36.         android:textColor="#006000"
  37.         android:text="删除"
  38.         android:textSize="20dp"/>
  39.     <Button
  40.         android:id="@+id/btn_select"
  41.         android:layout_width="120dp"
  42.         android:layout_height="40dp"
  43.         android:layout_marginLeft="160dp"
  44.         android:layout_marginTop="30dp"
  45.         android:background="@drawable/btn_bg"
  46.         android:textColor="#006000"
  47.         android:text="查询"
  48.         android:textSize="20dp"/>
  49. </LinearLayout>

  1. 接着创建一个Helper类,用来设置数据库。

    3.创建ContentProvider

    

  1. package cn.itcast.contentobserverdb;
  2. import android.content.ContentProvider;
  3. import android.content.ContentUris;
  4. import android.content.ContentValues;
  5. import android.content.UriMatcher;
  6. import android.database.Cursor;
  7. import android.database.sqlite.SQLiteDatabase;
  8. import android.database.sqlite.SQLiteOpenHelper;
  9. import android.net.Uri;
  10. public class PersonProvider extends ContentProvider {
  11.    private static UriMatcher mUriMatcher = new UriMatcher(-1);
  12.    private static final int SUCCESS =1;
  13.    private PersonDBOpenHelper helper;
  14.    static {
  15.        mUriMatcher.addURI("cn.itcast.contentobserverdb","info",SUCCESS);
  16.    }
  17.    public PersonProvider() {
  18.    }
  19.    @Override
  20.    public int delete(Uri uri, String selection, String[] selectionArgs) {
  21.        int code=mUriMatcher.match(uri);
  22.        if(code == SUCCESS){
  23.            SQLiteDatabase db=helper.getWritableDatabase();
  24.            int count=db.delete("info",selection,selectionArgs);
  25.            if(count>0){
  26.                getContext().getContentResolver().notifyChange(uri,null);
  27.            }
  28.            db.close();
  29.            return count;
  30.        }
  31.        else{
  32.            throw new IllegalArgumentException("路径不正确,无法随便删除数据!");
  33.        }
  34.    }
  35.    @Override
  36.    public String getType(Uri uri) {
  37.        // TODO: Implement this to handle requests for the MIME type of the data
  38.        // at the given URI.
  39.        throw new UnsupportedOperationException("Not yet implemented");
  40.    }
  41.    @Override
  42.    public Uri insert(Uri uri, ContentValues values) {
  43.        int code=mUriMatcher.match(uri);
  44.        if(code == SUCCESS){
  45.            SQLiteDatabase db=helper.getReadableDatabase();
  46.            long rowId=db.insert("info",null,values);
  47.            if(rowId >0){
  48.                Uri insertedUri= ContentUris.withAppendedId(uri,rowId);
  49.                getContext().getContentResolver().notifyChange(insertedUri,null);
  50.                return insertedUri;
  51.            }
  52.            db.close();
  53.            return uri;}
  54.        else{
  55.            throw new IllegalArgumentException("路径不正确,无法插入数据!");
  56.        }
  57.    }
  58.    @Override
  59.    public boolean onCreate() {
  60.        helper=new PersonDBOpenHelper(getContext());
  61.        return false;
  62.    }
  63.    @Override
  64.    public Cursor query(Uri uri, String[] projection, String selection,
  65.                        String[] selectionArgs, String sortOrder) {
  66.        int code=mUriMatcher.match(uri);
  67.        if(code == SUCCESS){
  68.            SQLiteDatabase db=helper.getReadableDatabase();
  69.            return db.query("info",projection,selection,selectionArgs,null,null,sortOrder);
  70.        }else {
  71.        throw new IllegalArgumentException("路径不正确,无法查询数据!");
  72.        }
  73.    }
  74.    @Override
  75.    public int update(Uri uri, ContentValues values, String selection,
  76.                      String[] selectionArgs) {
  77.        int code=mUriMatcher.match(uri);
  78.        if(code == SUCCESS){
  79.            SQLiteDatabase db=helper.getWritableDatabase();
  80.            int count=db.update("info",values,selection,selectionArgs);
  81.            if(count >0){
  82.                getContext().getContentResolver().notifyChange(uri,null);
  83.            }
  84.            db.close();
  85.            return count;
  86.        }
  87.        else{
  88.            throw new IllegalArgumentException("路径不正确,无法更新数据!");
  89.        }
  90.    }
  91. }

3.MainActivity中编写按钮逻辑代码

    创建数据库,设置点击事件。

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2.    private Button mbtn_insert;
  3.    private Button mbtn_update;
  4.    private Button mbtn_delete;
  5.    private Button mbtn_Select;
  6.    private ContentResolver resolver;
  7.    private Uri uri;
  8.    private ContentValues values;
  9.    @Override
  10.    protected void onCreate(Bundle savedInstanceState) {
  11.        super.onCreate(savedInstanceState);
  12.        setContentView(R.layout.activity_main);
  13.        initView();
  14.        createDB();
  15.    }
  16.    private void initView() {
  17.        mbtn_insert=(Button)findViewById(R.id.btn_insert);
  18.        mbtn_update=(Button)findViewById(R.id.btn_update);
  19.        mbtn_delete=(Button)findViewById(R.id.btn_delete);
  20.        mbtn_Select=(Button)findViewById(R.id.btn_select);
  21.        mbtn_insert.setOnClickListener(this);
  22.        mbtn_update.setOnClickListener(this);
  23.        mbtn_delete.setOnClickListener(this);
  24.        mbtn_Select.setOnClickListener(this);
  25.    }
  26.    private void createDB() {
  27.        PersonDBOpenHelper helper=new PersonDBOpenHelper(this);
  28.        SQLiteDatabase db=helper.getWritableDatabase();
  29.        for(int i =0;i<3;i++){
  30.            ContentValues values=new ContentValues();
  31.            values.put("name","itcast"+i);
  32.            db.insert("info",null,values);
  33.        }
  34.        db.close();
  35.    }
  36.    public void onClick(View v){
  37.        resolver=getContentResolver();
  38.        uri=Uri.parse("content://cn.itcast.contentobserverdb/info");
  39.        values=new ContentValues();
  40.        switch (v.getId()){
  41.            case R.id.btn_insert:
  42.                Random random=new Random();
  43.                values.put("name","add_itcast"+random.nextInt(10));
  44.                Uri newuri=resolver.insert(uri,values);
  45.                Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show();
  46.                Log.i("数据库应用","添加");
  47.                break;
  48.            case R.id.btn_delete:
  49.                int deleteCount=resolver.delete(uri,"name=?",new String[]{"itcast0"});
  50.                Toast.makeText(this,"成功删除了"+deleteCount+"行",Toast.LENGTH_SHORT).show();
  51.                Log.i("数据库应用","删除");
  52.                break;
  53.            case R.id.btn_select:
  54.                List data=new ArrayList<Map<String,String>>();
  55.                Cursor cursor=resolver.query(uri,new String[]{"_id","name"},null,null,null);
  56.                while (cursor.moveToNext()){
  57.                    Map<String,String> map=new HashMap<>();
  58.                    map.put("_id",cursor.getString(0));
  59.                    map.put("name",cursor.getString(1));
  60.                    data.add(map);
  61.                }cursor.close();
  62.                Log.i("数据库应用","查询结果:"+data.toString());
  63.                break;
  64.            case R.id.btn_update:
  65.                values.put("name","update_itcast");
  66.                int updateCount=resolver.update(uri,values,"name=?",new String[]{"itcast1"});
  67.                Toast.makeText(this, "成功更新了"+updateCount+"行", Toast.LENGTH_SHORT).show();
  68.                Log.i("数据库应用","更新");
  69.                break;
  70.        }
  71.    }
  72. }

4.创建MonitorData应用,后台运行并监视ContentObserverDB应用中的数据变化,提示数据变化并输出变化后的数据,在Monitor应用界面显示数据。

  1. public class MainActivity extends AppCompatActivity {
  2.    @Override
  3.    protected void onCreate(Bundle savedInstanceState) {
  4.        super.onCreate(savedInstanceState);
  5.        setContentView(R.layout.activity_main);
  6.        Uri uri= Uri.parse("content://cn.itcast.contentobserverdb/info");
  7.        getContentResolver().registerContentObserver(uri,true,new Myobserver(new Handler()));
  8.    }
  9.    private class Myobserver extends ContentObserver{
  10.        public Myobserver(Handler handler) {
  11.            super(handler);
  12.        }
  13.        public void onChange(boolean selfChange){
  14.            Log.i("监测到数据的变化","有人动了你的数据!");
  15.            super.onChange(selfChange);
  16.        }
  17.    }
  18.    protected  void onDestroy(){
  19.        super.onDestroy();
  20.        getContentResolver().unregisterContentObserver(new Myobserver(new Handler()));
  21.    }
  22. }

、实验结果

1,运行ContentobserverDB

找到数据库文件,导出并查看

2.点击运行MonitorData

由于采用默认界面,所以没有显示。返回ContentObserverDB界面,点击按钮。


 

   返回ContentObserverDB界面。点击按钮
 

查询tag“数据库应用

导出数据库并查看

 

查询tag“监测到数据的变化

四、实验总结

        在本次实验中,了解ContentProviderContentResolverContentObserver之间的联系,学会了使用内容提供者对外暴露数据,也学会了使用ContentResolver操作其他应用的数据,学习了ContentObserver监视并响应数据变化。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/223497
推荐阅读
相关标签
  

闽ICP备14008679号