Android中ContentProvider的用法

本文介绍如何使用ContentProvider实现Android应用间的数据共享。通过ContentResolver类的方法,如insert、delete、update和query,演示了如何操作共享数据。并提供了一个读取联系人信息的例子。
摘要由CSDN通过智能技术生成

在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个方法:

增加数据: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:

<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:

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来更新适配器中的数据。
来看一下效果:
这里写图片描述
单击“显示电话簿”按钮:
这里写图片描述
在这里,如果你用的是模拟器,并且模拟器中没有联系人的话要添加几个联系人。不然就显示的是空界面。这个需要注意一下

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值