内容提供者 ContentResolver 数据库 示例 -2

MainActivity




public class MainActivity extends ListActivity {

    // 访问内容提供者时需要的主机名称

    public static final String authority = "com.bqt.contentprovider.person";

    private TextView tv_info;

    private ContentResolver resolver;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        String[] array = { "获取所有数据", "插入一条name=bqt的数据", "修改name=bqt的数据", "删除name=bqt的数据", "清空所有数据",//

                "读取收件箱信息", "往收件箱插入一条信息", "读取手机联系人", "查询\"110\"的联系人信息", "添加一个新的联系人" };

        for (int i = 0; i < array.length; i++) {

            array[i] = i + "、" + array[i];

        }

        ListAdapter mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array)));

        resolver = getContentResolver();// 获取内容解析器

        tv_info = new TextView(this);// 将内容显示在TextView中

        tv_info.setTextColor(Color.BLUE);

        tv_info.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

        tv_info.setPadding(20, 10, 20, 10);

        getListView().addFooterView(tv_info);

        setListAdapter(mAdapter);

    }

    @Override

    protected void onListItemClick(ListView l, View v, int position, long id) {

        Uri uri = null;

        Uri returnUri = null;

        StringBuffer sb = new StringBuffer();

        int num = 0;

        ContentValues values = new ContentValues();// 要修改或插入的数据

        switch (position) {

        case 0: // 获取所有数据

            uri = Uri.parse("content://" + authority + "/query");// 指定解析器要解析的路径。注意query前要加路径分隔符【/】

            Log.i("bqt", uri.toString());//【 content://com.bqt.contentprovider.person/query】

            Cursor cursor = resolver.query(uri, null, null, null, null);// 获取解析器解析的结果集

            if (cursor != null) {

                while (cursor.moveToNext()) {

                    int uId = cursor.getInt(cursor.getColumnIndex("id"));// 取出需要的内容

                    String uName = cursor.getString(cursor.getColumnIndex("name"));

                    String uNumber = cursor.getString(cursor.getColumnIndex("number"));

                    sb.append("id:" + uId + "    name:" + uName + "    number:" + uNumber + "\n");

                }

                tv_info.setText(sb.toString());

                cursor.close();

            }

            break;

        case 1:// 插入一条数据

            uri = Uri.parse("content://" + authority + "/insert");

            values.put("id", new Random().nextInt(10));

            values.put("name", "bqt");

            values.put("number", "10086");

            returnUri = resolver.insert(uri, values);

            tv_info.setText("插入信息的uri:" + returnUri.toString());

            break;

        case 2: // 修改一条数据

            uri = Uri.parse("content://" + authority + "/update");

            values.put("name", "dog");

            values.put("number", "10087");

            num = resolver.update(uri, values, "name=?", new String[] { "bqt" });// 指定uri,values,Where子句,占位符的值

            tv_info.setText("修改信息个数:" + num);

            break;

        case 3: // 删除一条数据

            uri = Uri.parse("content://" + authority + "/delete");

            num = resolver.delete(uri, "name=?", new String[] { "bqt" });

            tv_info.setText("删除信息个数:" + num);

            break;

        case 4: // 清空,删除所有数据

            uri = Uri.parse("content://" + authority + "/delete");

            num = resolver.delete(uri, null, null);

            tv_info.setText("删除信息个数:" + num);

            break;

        //******************************************************************************************

        case 5: // 读取收件箱信息

            readMsgs();

            break;

        case 6: // 往收件箱插入一条信息

            insertMsg();

            break;

        case 7: // 读取手机联系人

            readContact();

            break;

        case 8: // 查询指定电话的联系人信息

            queryContact("110");

            break;

        case 9: // 添加一个新的联系人

            writeContact();

            break;

        }

    }

    /** 读取收件箱信息。<uses-permission android:name="android.permission.READ_SMS"/> */     public void readMsgs() {         Uri uri = Uri.parse("content://sms/");         ContentResolver resolver = getContentResolver();         //获取的是哪些列的信息         Cursor cursor = resolver.query(uri, new String[] { "address", "date", "type", "body" }, null, null, null);         if (cursor != null) {             StringBuffer sb = new StringBuffer();             while (cursor.moveToNext()) {                 sb.append("联系人:" + cursor.getString(cursor.getColumnIndex("address")));                 sb.append("\n时间:" + cursor.getString(cursor.getColumnIndex("date")));                 sb.append("\n类型:" + cursor.getString(cursor.getColumnIndex("type")));                 sb.append("\n内容:" + cursor.getString(cursor.getColumnIndex("body")));                 sb.append("\n===============================\n");             }             tv_info.setText(sb.toString());             cursor.close();         }     }     /**读取手机收件箱,返回一个集合*/     public ArrayList<String> getSms() {         ArrayList<String> mArrayList = new ArrayList<String>();         ContentResolver resolver = getContentResolver();         Uri uri = Uri.parse("content://sms/");         Cursor cursor = resolver.query(uri, new String[] { "body", "address", "type", "date" }, null, null, null);         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());         while (cursor.moveToNext()) {             String body = "内容:" + cursor.getString(0);             String address = "联系人:" + cursor.getString(1);             String type = "类型:" + cursor.getString(2);//1是接收到的,2是已发出 ,但是 3 是什么鬼?             String date = "时间:" + formatter.format(new Date(Long.parseLong(cursor.getString(3))));             mArrayList.add(new String(body + "\n" + address + "\n" + type + "\n" + date + "\n\n"));         }         cursor.close();         return mArrayList;     }     /** 往收件箱插入一条信息,"android.permission.WRITE_SMS" 。从5.0开始,默认短信应用外的软件不能以写入短信数据库的形式发短信 */     public void insertMsg() {         ContentValues values = new ContentValues();         values.put("address", "10086");//联系人         values.put("type", 1);//类型1是"收到"的短信         values.put("date", System.currentTimeMillis());//收到的时间         values.put("body", "您的余额还有1,000,000万元!");//内容         Uri returnUri = resolver.insert(Uri.parse("content://sms"), values);         if (returnUri != null) {             tv_info.setText(returnUri.toString());             if (returnUri.getPath().equals("/0")) {                 Toast.makeText(this, "添加失败:" + returnUri.getPath(), Toast.LENGTH_SHORT).show();             } else {                 Toast.makeText(this, "添加成功:" + returnUri.getPath(), Toast.LENGTH_SHORT).show();             }         }     }
    /** 读取手机联系人 <uses-permission android:name="android.permission.READ_CONTACTS"/> */     public void readContact() {         //查询raw_contacts表获得联系人的id         ContentResolver resolver = getContentResolver();         Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;         //查询联系人数据         Cursor cursor = resolver.query(uri, null, null, null, null);         if (cursor != null) {             StringBuffer sb = new StringBuffer();             while (cursor.moveToNext()) {                 sb.append("姓名:" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));                 sb.append("\n号码:" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));                 sb.append("\n===============================\n");             }             tv_info.setText(sb.toString());             cursor.close();         }         cursor.close();     }     /**查询指定电话的联系人信息*/     public void queryContact(String number) {         Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);         ContentResolver resolver = getContentResolver();         Cursor cursor = resolver.query(uri, new String[] { "display_name" }, null, null, null);         if (cursor != null) {             if (cursor.moveToFirst()) {                 String name = cursor.getString(0);                 Toast.makeText(this, number + "对应的联系人名称:" + name, Toast.LENGTH_SHORT).show();             } else {                 Toast.makeText(this, number + "木有此联系人", Toast.LENGTH_SHORT).show();             }             cursor.close();         }     }     /**读取手机联系人,返回一个集合*/     public List<Map<String, String>> getContacts() {         //把所有的联系人保存在List集合中         List<Map<String, String>> list = new ArrayList<Map<String, String>>();         ContentResolver resolver = getContentResolver();         Uri uriId = Uri.parse("content://com.android.contacts/raw_contacts");//id信息         Uri uriData = Uri.parse("content://com.android.contacts/data");//具体的联系人信息         //获取包含id的结果集         Cursor cursor = resolver.query(uriId, new String[] { "contact_id" }, null, null, null);         //遍历此包含id的结果集         while (cursor.moveToNext()) {             String contact_id = cursor.getString(0);             if (contact_id != null) {                 //将对应此id的所有联系人信息保存在map集合中                 Map<String, String> map = new HashMap<String, String>();                 Cursor dataCursor = resolver.query(uriData, new String[] { "data1", "mimetype" }, "contact_id=?", new String[] { contact_id }, null);                 //遍历对应此id的所有联系人信息的结果集                 while (dataCursor.moveToNext()) {                     String data1 = dataCursor.getString(0);//联系人信息                     String mimetype = dataCursor.getString(1);//此联系人信息的类型                     //若mimetype为联系人的姓名或电话号码,则以相应的格式保存在map集合中                     if ("vnd.android.cursor.item/name".equals(mimetype)) map.put("name", data1);//保存姓名                     else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) map.put("phone", data1);//保存电话                 }                 //将map集合中的数据保存在list集合中                 list.add(map);                 dataCursor.close();             }         }         cursor.close();         return list;     }     /**添加一个新的联系人。"android.permission.WRITE_CONTACTS" */     public void writeContact() {         ContentResolver resolver = getContentResolver();         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//保存联系人的id         Uri dataUri = Uri.parse("content://com.android.contacts/data");//保存联系人的数据         Cursor cursor = resolver.query(uri, new String[] { "_id" }, null, null, null);// 注意列名是【_id】         if (cursor.moveToLast()) {// 移动到最后一条记录             int lastId = cursor.getInt(0);// 获取最后一条记录【第零列】的值(即id的值)             int newId = lastId + 1;// 设定要插入的记录的id值             ContentValues values = new ContentValues();             values.put("contact_id", newId);//插入一条记录             resolver.insert(uri, values);// 向raw_contacts表中插入一条记录             //电话             ContentValues phoneValues = new ContentValues();             phoneValues.put("data1", "110");//向data1表中插入一条指定的值(电话)             phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");//指定这个值是一个电话类型             phoneValues.put("raw_contact_id", newId);//指定这个值(电话)对应哪个id             resolver.insert(dataUri, phoneValues);             //emai             ContentValues emaiValues = new ContentValues();             emaiValues.put("data1", "[email protected]");             emaiValues.put("mimetype", "vnd.android.cursor.item/email_v2");             emaiValues.put("raw_contact_id", newId);             resolver.insert(dataUri, emaiValues);             //姓名             ContentValues nameValues = new ContentValues();             nameValues.put("data1", "包青天");             nameValues.put("mimetype", "vnd.android.cursor.item/name");             nameValues.put("raw_contact_id", newId);             resolver.insert(dataUri, nameValues);         }         cursor.close();         Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();     } }

清单文件


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.bqt.contentresolver"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.READ_SMS" />

    <uses-permission android:name="android.permission.WRITE_SMS" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!-- 内容提供者定义的权限 -->

    <uses-permission android:name="com.bqt.permission" />

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

来自为知笔记(Wiz)

时间: 2025-01-05 12:30:51

内容提供者 ContentResolver 数据库 示例 -2的相关文章

内容提供者 ContentResolver 数据库 示例 -1

MainActivity public class MainActivity extends ListActivity {     private TextView tv_info;     private EditText editText;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         List

第九天 内容提供者 ContentResolver

1. 内容提供者,提供 其他数据库的访问. 内容提供者需要在配置清单中 配置 1 <provider android:name="" 2 android:authorities="" 3 android:exported="true"></provider>

android100 自定义内容提供者

#ContentProvider,就是来操作数据的,增删改查, * 四大组件之一 * 应用的数据库是不允许其他应用访问的 * 内容提供者的作用就是让别的应用访问到你的数据库 * 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 *短信联系人都是在数据库里面.mmssms是短信数据库, *短信数据库有短信数据库的内容提供者,联系人数据库有联系人数据库的内容提供者.拿到对应数据库的内容提供者就能够访问对应的数据库数据. ###短信数据库 * sms表 * body

Android10_内容提供者_内容观察者_标题栏

安卓四大组件Activity ,Service,BroadCastReceiver,ContentProvider(内容提供者) 1.1内容提供者的作用: 应用程序创建的数据库默认都是私有的,别的应用程序不可以访问里面的数据,如果有需求把自己应用程序私有的数据库暴露给别的用户增删改查,就需要使用内容提供者. 1.2 内容提供者的代码实现 在需要提供给它人数据的应用中 ①创建一个项目,并且创建数据库(数据库开启帮助类)(非必要) ②创建一个类,继承ContentProvider内容提供者, 内容提

【安卓】如何使用广播和内容提供者来叫醒小伙伴(控制你的朋友)

摘要:通过多种方法来获取最新短信(静态广播,动态广播,监测数据库变动),保证短信的稳定获取,为了保证应用正常运行,代码中使用开机启动 service的方法,并且能够保证程序不被用户意外关闭出现无法提醒的问题,收到命令后使用内容提供者删除命令短信 ============================================================================================================================= 正

内容提供者(内容提供者实现、使用场景、Uri、短信的备份与还原等等)

1.编写内容提供者 步骤: 1.在工程里创建一个类,继承ContentProvider,重写了onCreate和增删改查的方法: 2.在清单文件中配置一个provider,需要这个数据authorities,用来唯一标识内容者的,在android4.1版本之后需要exported="true"的属性,否则其他应用程序没有权限访问这个内容提供者: 3.在onCreate方法里得到数据库的帮助类: 2.内容提供者工作的原理 模版代码: //uri匹配正时返回的匹配码 int code =

Android 内容提供者(ContentProvider)的简单实用

Android 中的数据库是对应用私有的,自己是无法使用别的应用的数据库的.但是往往有需求要我们使用另外一个应用或者系统应用的数据,这时候就彰显了内容提供者,ContentPrivider的作用,他就是两个应用数据的桥梁,通过内容提供者和内容接受者我们可以在不同应用间传递数据. ContentPrivider也可以视为一种数据存储.它存储数据的方式和使用它的应用程序无关,重要的是应用如何以一致的编程接口,来访问存储其中的数据.内容提供者与数据库的使用差不多,也可以增删改查.而且数据可以存储于数据

内容提供者和内容观察者

1.创建一个内容提供者,继承contentProvider,作为四大组件之一,contentProvider需要在配置文件中进行配置 <provider android:name="cn.itcast.mobilesafe.provider.AppLockedProvider" android:authorities="cn.itcast.applockprovider"> </provider> 2. package cn.itcast.m

内容提供者ContentProvider和内容解析者ContentResolver

简介 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据.那么,这里为何要使用ContentProvider 对