前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android中ContentProvider的用法

Android中ContentProvider的用法

作者头像
指点
发布2019-01-18 17:20:04
2K0
发布2019-01-18 17:20:04
举报
文章被收录于专栏:指点的专栏指点的专栏

在Android中,如果要将一个程序的数据共享给另一个程序,在之前的Android版本,我们可以设置Android文件和SharedPreferences操作的两个模式:MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式来使得数据可以被其他应用程序读写,但是这两种模式在在Android4(具体4.几也不记得了。。。)的时候就被废除了,那么现在要在不同的Android程序之间共享数据的话就只能通过ContentProvider(内容提供器)来实现了(排除你是黑客的前提下)。 下面来看一下怎么来读取其他Android程序的数据。

首先,如果要访问一个应用程序通过ContentProvider共享的数据,一定要借助ContentResolver类,我们可以通过Context类的getContentResolver()方法获取ContentResolver类的对象,

之后,我们就可以通过ContentResolver类提供的一些方法对数据进行 增加、更改、删除、查询 操作(和数据库的4个操作类似)。

和数据库操作不同的是,ContentResolver类的这些操作都不是通过数据库表名进行的,而是通过传入ContentProvider共享数据的Uri(统一资源标识符,通过它可以找到任何文件所处的位置)对象来标识和操作共享的数据

接下来来看一下ContentResolver类提供的操作数据的4个方法:

代码语言:javascript
复制
增加数据:insert(Uri url, ContentValues values)
第一个参数是要增加的数据所在数据表的Uri,第二个参数是通过
ContentValues对象储存的数据,通过键值对储存


删除数据:delete (Uri url, String where, String[]
                selectionArgs) 
第一个参数要删除的数据所在数据表的Uri,第二个参数是删除的条件,可以存在占位符,第三个参数是补全第二个参数的占位符


更改数据:update(Uri uri, ContentValues values, 
                String where, 
                String[] selectionArgs) 
第一个参数是要更改的数据所在数据表的Uri,第二个参数是更改后的数据,第三第四个参数是更改数据的条件(和删除类似)


查询数据:query(Uri uri, String[] projection, String 
                selection, String[] selectionArgs, 
                String sortOrder) 
第一个参数是要查询的数据所在数据表的Uri,第二个参数是要查询的具体列的信息,第三第四个参数是要查询的数据满足的条件,
第五个参数是查询结果的排序方式

下面通过一个小例子来理解: 通过ContentProvider来读取联系人信息并且建立自定义的ContentProvider,新建一个Android工程: main_activity.xml:

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/buttonShowContacts"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示电话簿" />
    <ListView 
        android:id="@+id/contactsList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

一个按钮,对应于获取联系人信息事件,一个ListView用于显示联系人的信息。 接下来是MainActivity.java:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

    Button button = null;
    List<String> contactsList = new ArrayList<String>();
    ArrayAdapter<String> adapter;
    ListView contactsView = null;
    ContentResolver contentResolver = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.buttonShowContacts);
        button.setOnClickListener(listener);

        contactsView = (ListView) findViewById(R.id.contactsList);
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, contactsList);
        contactsView.setAdapter(adapter);

        contentResolver = getContentResolver(); // 获取ContentResolver对象
    }

    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch(v.getId())
            {
            case R.id.buttonShowContacts:
                showContacts();
                break;
            }
        }
    };

    private void showContacts()
    {
        /*
         * 调用getContentResolver()方法获取ContentResolver对象,并且调用query方法,
         * 传入联系人的Uri,来查询联系人信息,类似于数据库的查询方法。
         */
        Cursor cursor = contentResolver.query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null, null, null);
        if(cursor.moveToFirst())
        {
            contactsList.clear();
            do
            {
                /*
                 * 获取联系人姓名
                 */
                String str = "姓名:" + cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) + "\n";
                /*
                 * 获取联系人电话号码
                 */
                str += "电话:" + cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactsList.add(str);
            }while(cursor.moveToNext());
        }
        cursor.close();
        adapter.notifyDataSetChanged(); // 适配器发送更改后的数据
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

MainActivity.java主要做一件事:自定义一个方showContacts() 用于获取联系人信息并且显示在ListView控件中,这个方法中 首先调用了ContentResolver类的query方法并且传入储存联系人信息那张数据表的Uri,用于查询联系人信息那张数据表的数据,之后对查询的返回结果Cursor进行处理,将储存联系人信息的ArrayList<String>对象中的数据清空,并且将Cursor对象中储存的数据提取到ArrayList<String>对象中, 之后调用适配器adapter.notifyDataSetChanged来更新适配器中的数据。 来看一下效果:

这里写图片描述
这里写图片描述

单击“显示电话簿”按钮:

这里写图片描述
这里写图片描述

在这里,如果你用的是模拟器,并且模拟器中没有联系人的话要添加几个联系人。不然就显示的是空界面。这个需要注意一下

如果博客中有什么不正确的地方,还请多多指点。 谢谢观看。。。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年02月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档