专栏首页指点的专栏Android中ContentProvider的用法

Android中ContentProvider的用法

在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来更新适配器中的数据。 来看一下效果:

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 中拍照、相册选择、裁剪照片

    一个多月没总结知识点了,差点连博客账号都忘了。。。好了,步入正题,在 Android 中调用摄像头拍照获取图片或者是从相册中选取图片是很常见的功能,比如某些 A...

    指点
  • Android 全局广播的使用

    广播作为Android一个重要的组成部分,很多功能的实现都依赖于广播,Android系统在发生一些重要事情的时候都会发送广播(电量变化、网络变化等等)。我们也可...

    指点
  • Android中的通知和自定义通知布局

    Android中的通知(Notification)是Android中的重要一部分,应用程序通过通知来提醒用户或者向用户传达信息,下面让我们来看一下怎么在我们的程...

    指点
  • 通过GET方式传递数据给服务器

    自动生成的ServerGET.java中有 @WebServlet(“/ServerGET”) 所以web.xml就不需要配置了

    提莫队长
  • IP拨号监听去电

    今天做了一个小demo。主要是想回顾一下BroadcastReceiver的手动注册的方法,同时也温习一下service 布局文件main.xml

    提莫队长
  • 在Android中调用WebService

    某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这...

    欢醉
  • android文件混淆详解

    -injars  androidtest.jar【jar包所在地址】  -outjars  out【输出地址】 -libraryjars    'D:\a...

    xiangzhihong
  • 速读原著-Android应用开发入门教程(网格(Grid)视图组)

    本节介绍的网格(Grid)视图组可以将某种控件按照网格的形式组织起来,平铺在屏幕上。

    cwl_java
  • Android 天气APP(二十三)增加灾害预警、优化主页面UI

    天气预报光有普通天气总感觉好少了点什么,所以和风天气给不上了,那就是灾害天气的预警,灾害预警API可以获取指定城市的极端天气预警数据。

    晨曦_LLW
  • [android] 手机卫士接收打电话广播显示号码归属地

    新建一个类OutCallReceiver继承系统的BroadcastReceiver

    陶士涵

扫码关注云+社区

领取腾讯云代金券