zoukankan      html  css  js  c++  java
  • ContentProvider,ContentResolver和ContentObserver 使用

    1 ContentProvider内容提供者

    四大组件之一,实现不同程序实现数据的共享。联系人应用就使用了ContentProvider,比如你在自己的应用可以读取和修改联系人的数据(获得相应权限)。
    其实它也是一个中间人,真正的数据源是文件或者SQLite。通过Uri向外暴露访问地址 

    2 ContentResolver内容解析者

    一个应用通过ContentResolver可以访问另一个应用通过ContentProvider提供的数据(当然也可以在自己的应用中)。

    3 ContentObserver内容观察者

    监听数据库的变化,执行相应的操作。更新UI
    mContentResolver.registerContentObserver(WicketProvider.CONTENT_URI, true, mChatObserver);
    使用步骤
    1 自定义UserContentProvider
       a 自定义数据库工具类
       b 自定义UserContentProvider继承ContentProvider 覆写对应的方法
          创建,增删改查方法
     1 public class UserContentProvider extends ContentProvider {

    // 声明当前ContentProvider组件的唯一标识(Authority),注:必须使用小写字母
    private static final StringAUTHORITY ="com.user.contentprovider.users";
     2     @Override
     3     public boolean onCreate() {
     4         return false;
     5     }
     6 
     7     @Nullable
     8     @Override
     9     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    10         return null;
    11     }
    12 
    13     @Nullable
    14     @Override
    15     public String getType(Uri uri) {
    16         return null;
    17     }
    18 
    19     @Nullable
    20     @Override
    21     public Uri insert(Uri uri, ContentValues values) {
    22         return null;
    23     }
    24 
    25     @Override
    26     public int delete(Uri uri, String selection, String[] selectionArgs) {
    27         return 0;
    28     }
    29 
    30     @Override
    31     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    32         return 0;
    33     }
    34 }

       c 清单文件中配置provider

    <provider android:name="com.user.contentprovider.UserContentProvider"
       android:authorities="com.user.contentprovider.users"
       android:exported="true"/>

    2 另一个应用中使用ContentResolver访问数据

     1 public class MainActivity extends Activity{
     2          private TextView tv_info;
     3          private ContentResolver resolver;
     4          private Uri uri = Uri.parse("content://com.user.contentprovider.users/users");
     5       @Override
     6       protected void onCreate(Bundle savedInstanceState) {
     7           // TODO Auto-generated method stub
     8            super.onCreate(savedInstanceState);
     9            setContentView(R.layout.layout_main);
    10             tv_info = (TextView)findViewById(R.id.tv_info);
    11            resolver = getContentResolver();
    12       }
    13         public void click(View v){
    14              switch (v.getId()) {
    15              case R.id.bt_query:
    16               //建表时的语句:create table t_user(_id integer primary key,uname,upass,money)
    17               query();//调用自定义的查询所有数据的方法
    18               break;
    19             case R.id.bt_insert:
    20               insert();//调用自定义的插入数据的方法
    21               break;
    22             case R.id.bt_update:
    23             //请自行实现
    24              break;
    25           default:
    26             break;
    27         }
    28      }
    29      private void insert() {
    30        //调用自定义的插入数据的方法(硬编码)
    31         ContentValues values = new ContentValues();
    32           values.put("uname", "zhang");
    33         values.put("upass", "321");
    34           values.put("money", "99");
    35         Uri nUri = resolver.insert(uri, values);//sqlite会自动指定主键id
    36        long newId = ContentUris.parseId(nUri);//获取新插入的id
    37       Toast.makeText(this, ""+newId, 0).show();
    38    }
    39    private void query() {
    40     //自定义的查询所有数据的方法
    41      Cursor c = resolver.query(uri , new String[]{"_id","uname","upass","money"}, null, null,null);
    42     String text = "";
    43     while(c.moveToNext()){
    44           text +=c.getString(0)+","+c.getString(1)+","+c.getString(2)+","+c.getString(3)+"
    ";
    45     }
    46      tv_info.setText(text);
    47    }
    48 }
    【备注:】
    ContentProvider是单例模式的,当多个应用程序通过使用ContentResolver 来操作使用ContentProvider 提供的数据时,ContentResolver 调用的数据操作会委托给同一个ContentProvider 来处理。这样就能保证数据的一致性。
    Cursor 游标,查询时返回的结果集 
    具体应用参考实际开发项目。
     
    使用ContentProvider和ContentResolver时,是否可用第三方ORM数据库工具,如GreenDao操作数据库?
    不建议使用。这两者是通过Uri来操作数据,而GreenDao是通过bean来操作数据库。
     
    SQLiteDatabase 和 ContentResolver操作数据库api有所不同,前者操作对象为表,后者为Uri。
     
  • 相关阅读:
    Vue--vue-Router
    Vue--vue中的组件、组件绑定事件和数据、私有组件、子组件,父子组件参数互传
    CF 631C report
    生日Party 玄学多维DP
    HDU-6376 度度熊剪纸条
    CF 1012C Dp
    CF 997A
    HDU-1051 一个DP问题
    偶尔间看到,来开心一下
    合并石子
  • 原文地址:https://www.cnblogs.com/suiyilaile/p/9025302.html
Copyright © 2011-2022 走看看