android 内容观察者的使用笔记

使用ContentResolver查询 ContentResolver 共享出来的数据。 使用ContentObserver内容观察者实时监听ContentResolver 共享的数据的变化

代码用例

一、创建一个demo程序 com.example.kangxg.first

     1.activity 布局文件   

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    android:paddingBottom="16sp"
     android:paddingLeft="16sp"
    android:paddingTop="16dp"
    android:paddingRight="16dp"
    tools:context=".MailListActivity">

    <LinearLayout
        android:id="@+id/ll_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/ll_phone"
        android:layout_alignLeft="@+id/ll_btn"
        android:layout_alignStart="@+id/ll_btn"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="姓  名:" />

        <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:maxLines="1"
            android:hint="请输入姓名" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ll_phone"
        android:layout_marginBottom="10dp"
        android:layout_above="@+id/ll_btn"
        android:layout_alignLeft="@+id/ll_name"
        android:layout_alignStart="@+id/ll_name"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18dp"
            android:text="电  话:" />

        <EditText
            android:id="@+id/et_phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:maxLines="1"
            android:hint="请输入手机号"  />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ll_btn"
        android:orientation="horizontal"
        android:layout_centerVertical="true">

        <Button
            android:id="@+id/btn_add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="18dp"
            android:background="#B9B9FF"
            android:layout_marginRight="2dp"
            android:text="添加" />
        <Button
            android:id="@+id/btn_query"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textSize="18dp"
            android:background="#DCB5FF"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:text="查询" />



        <Button
            android:id="@+id/btn_update"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textSize="18dp"
            android:background="#E6CAFF"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:text="修改" />

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textSize="18dp"
            android:background="#ACD6FF"
            android:layout_weight="1"
            android:text="删除" />
    </LinearLayout>

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:layout_below="@+id/ll_btn"
        android:textSize="20sp"
        android:text="" />

</RelativeLayout>

2.activity实体类

   

public class MailListActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText mEtName;
    private EditText mEtPhone;
    private TextView mTvShow;
    private Button   mBtnAdd;
    private Button   mBtnUpdate;
    private Button   mBtnQuery;
    private Button   mBtnDelete;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mail_list);
        initView();
    }


    private void  initView()
    {
         mEtName     =   (EditText)findViewById(R.id.et_name);
         mEtPhone    =   (EditText)findViewById(R.id.et_phone);
         mTvShow     =   (TextView)findViewById(R.id.tv_show);

         mBtnAdd     =   (Button)findViewById(R.id.btn_add);
         mBtnQuery   =   (Button)findViewById(R.id.btn_query);
         mBtnUpdate  =   (Button)findViewById(R.id.btn_update);
         mBtnDelete  =   (Button)findViewById(R.id.btn_delete);

         mBtnAdd.setOnClickListener(this);
         mBtnQuery.setOnClickListener(this);
         mBtnUpdate.setOnClickListener(this);
         mBtnDelete.setOnClickListener(this);
    }

    private   ContentResolver contentResolver;
    private   ContentValues values;
    private   Uri       uri;
    @Override
    public void onClick(View v)
    {
        contentResolver  = getContentResolver();
        uri = Uri.parse("content://com.example.kangxg.first/userInformation");
        values = new ContentValues();

        switch (v.getId())
        {
            case R.id.btn_add:

                values = new ContentValues();
                values.put("name",mEtName.getText().toString().trim());
                values.put("phone",mEtPhone.getText().toString().trim());
                Uri newuri  = contentResolver.insert(uri,values);

                Toast.makeText(this,"信息已经添加",Toast.LENGTH_SHORT).show();
                Log.i("数据库应用:","添加");
                break;
            case R.id.btn_query:
               List<Map<String,String>> data = new ArrayList<Map<String, String>>();

                Cursor cursor = contentResolver.query(uri,new String[]{"_id","name","phone"},null,null,null);
                mTvShow.setText("");
                while (cursor.moveToNext())
                {
                    Map<String,String> map = new HashMap<String,String>();
                    map.put("_id",cursor.getString(0));
                    map.put("name",cursor.getString(1));
                    map.put("phone",cursor.getString(2));
                    data.add(map);
                    mTvShow.append("Name: "+ cursor.getString(1)+" :Tel: " + cursor.getString(2)+"\n");
                }
                cursor.close();

                Log.i("数据库应用:","查询结果"+data.toString());
                break;
            case R.id.btn_update:
                String phone ;
                values.put("phone", phone = mEtPhone.getText().toString().trim());
                int updatecount =  contentResolver.update(uri,values,"name=?",new String[]{mEtName.getText().toString().trim()});

                Toast.makeText(this,"数据更新了"+updatecount+"行",Toast.LENGTH_SHORT).show();
                Log.i("数据库应用:","数据更新了"+updatecount+"行");

                break;
            case R.id.btn_delete:
                int count = contentResolver.delete(uri,"name=?",new String[]{mEtName.getText().toString().trim()});

                Toast.makeText(this,"数据成功删除了"+count+"行",Toast.LENGTH_SHORT).show();
                Log.i("数据库应用:","数据成功删除了"+count+"行");
                break;
            default:
                break;

        }

    }
}

3.创建数据库帮助类

public class UserDBHelper extends SQLiteOpenHelper {
    private  static final String DB_NAME = "user.db";
    private  static final int    DB_VERSION = 2;
    private  static UserDBHelper mHelper = null;
    private  SQLiteDatabase      mDB = null;
    private UserDBHelper(Context context)
    {
        super(context,DB_NAME,null,DB_VERSION);
    }

    private UserDBHelper(Context context,int version)
    {
        super(context,DB_NAME,null,version);
    }

    public static UserDBHelper getInstance(Context context,int version)
    {
        if (version>0 && mHelper == null)
        {
            mHelper = new UserDBHelper(context,version);
        }
        else {
            mHelper = new UserDBHelper(context);
        }

        return mHelper;
    }

    public SQLiteDatabase openReadLink() {
       if(mDB == null|| mDB.isOpen() != true)
       {
           mDB = mHelper.getReadableDatabase();
       }

       return mDB;
    }

    public SQLiteDatabase openWriteLink() {
        if(mDB == null|| mDB.isOpen() != true)
        {
            mDB = mHelper.getWritableDatabase();
        }

        return mDB;
    }
    public void closeLink()
    {
        if (mDB != null || mDB.isOpen() == true)
        {
            mDB.close();
        }
        mDB = null;
    }

    public String getDbName() {
        if (mHelper != null)

        {
            return  mHelper.getDatabaseName();
        }
        return DB_NAME;
    }

    private  void createTable(String tablename,SQLiteDatabase
                              db) {
        if (db != null)
        {
            String sql =  "create table if not exists  userInformation(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20),phone VARCHAR(20))";
            db.execSQL(sql);
        }


    }
    @Override
    public void onCreate(SQLiteDatabase db)
    {
          createTable("usertable",db);
    }


    @Override
    public  void onUpgrade(SQLiteDatabase var1, int var2, int var3){

    }
}

4.创建一个内容提供者ContentProvider

public class UserProvider extends ContentProvider {
    private  static UriMatcher matcher = new UriMatcher((-1));
    private  static   String     tablename = "userInformation";
    private  static  final  int SUCCESS = 1;
    private  UserDBHelper dbHelper ;
    static {
        matcher.addURI("com.example.kangxg.first",tablename,SUCCESS);
    }
    @Override
    public boolean onCreate() {
        // TODO: Implement this to initialize your content provider on startup.
        dbHelper = com.example.kangxg.first.tool.UserDBHelper.getInstance(getContext(),2);
        return false;
    }

    public UserProvider() {
    }
    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
       return  null;
    }


    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        // TODO: Implement this to handle query requests from clients.
           int code = matcher.match(uri);
           if (code == SUCCESS)
           {
               SQLiteDatabase db = dbHelper.getWritableDatabase();
               return  db.query(tablename,projection,selection,selectionArgs,null,null,sortOrder);
           }else {
               throw  new  IllegalArgumentException("路径不正确,停止使用提供数据");
           }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO: Implement this to handle requests to insert a new row.
        int code = matcher.match(uri);
        if (code == SUCCESS)
        {
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            long rowid = db.insert(tablename,null,values);
            if (rowid>0)
            {
                Uri insertedUri = ContentUris.withAppendedId(uri,rowid);
                getContext().getContentResolver().notifyChange(insertedUri,null);

                return  insertedUri;
            }
            dbHelper.closeLink();
            return  uri;
        }
        else
        {
            throw  new  IllegalArgumentException("路径不正确,停止插入数据");
        }
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // Implement this to handle requests to delete one or more rows.
        int code = matcher.match(uri);
        if (code == SUCCESS)
        {
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            int count   = db.delete(tablename,selection,selectionArgs);
            if (count>0)
            {
                getContext().getContentResolver().notifyChange(uri,null);
            }
            db.close();
            return  count;
        }
        else {
            throw  new  IllegalArgumentException("路径不正确,停止删除数据");
        }
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO: Implement this to handle requests to update one or more rows.
        int code = matcher.match(uri);
        if (code == SUCCESS)
        {
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            int count = db.update(tablename,values,selection,selectionArgs);
            if (count>0){
                getContext().getContentResolver().notifyChange(uri,null);
            }
            db.close();
            return  count;
        }
        else {
            throw  new  IllegalArgumentException("路径不正确,停止更新数据");
        }
    }
}

5创建一个名为MonitorData的程序

        

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView =  (TextView)findViewById(R.id.tv_change);
        Uri uri = Uri.parse("content://com.example.kangxg.first/userInformation");
        getContentResolver().registerContentObserver(uri,true,new  MyObserver(new Handler()));
    }

    private  class  MyObserver extends ContentObserver{
        public MyObserver(Handler handler)
        {
            super(handler);

        }

        @Override
        public  void onChange(boolean selfChange)
        {
            //Log.i("监测数据变化","有人动了你的程序");
            textView.setText("有人动了你的程序");
            super.onChange(selfChange);

            Uri uri = Uri.parse("content://com.example.kangxg.first/userInformation");
            ContentResolver resolver = getContentResolver();
            Cursor cursor = resolver.query(uri,new String[]{"_id","name","phone"},null,null,null);
            cursor.moveToFirst();
            textView.setText("name:"+cursor.getString(1)+"phone:"+cursor.getString(2));
            Log.i("监测数据变化","有人动了你的程序"+"name:"+cursor.getString(1)+"phone:"+cursor.getString(2));
            cursor.close();
        }
    }
}

二 运行程序

   1.首先运行MonitorData程序 再运行first程序

    2.在first程序上进行操作

        

3.在logcat看到日志输出

  

发布了255 篇原创文章 · 获赞 39 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/kangguang/article/details/103956790
今日推荐