• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android开发学习之路--Content Provider之初体验

Android开发学习之路--Content Provider之初体验

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Android开发学习之路--Content Provider之初体验等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android开发学习之路--Content Provider之初体验


天气说变就变,马上又变冷了,还好空气不错,阳光也不错,早起上班的车上的人也不多,公司来的同事和昨天一样一样的,可能明天会多一些吧,那就再来学习android吧。学了两个android的组件,这里学习下第三个android的组件,Content Provider内容提供器。

Content Provider向我们提供了在不同应用程序之间的数据共享,比如微信啊,支付宝啊,想要获取手机联系人的信息,而手机联系人是另一个应用程序,那么这时候就需要用到Content Provider了。Content Provider为存储和获取数据提供了统一的接口,对数据进行了封装,我们不用关心数据存储的细节,使用表的形式来组织数据。Android提供了一些默认的ContentProvider,比如音频,视频,图片和通讯录等。

类似于文件,SharedPreferences或者SQLiteDataBase都有一个路径,那么ContentProvider也是有路径的,它的路径由Uri表示,Uri主要包含了两部分的信息,一个是需要操作的ContentProvider,另一个就是对ContentProvider中的什么数据进行操作。一个简单的Uri:

content://com.example.contentprovidertest.provider/person/2

scheme:content://表示,这个是android定义好的,不能改变的

 

主机名或者authority:com.example.contentprovidertest.provider表示,唯一的,一般指的是包名,

路径:person,表示的是person这个表,2表示id为2。

如果要把上面的字符串转变为uri,那么就要使用Uri类中的parse()方法,如下:

    Uri uri=Uri.parse("content://com.example.contentprovidertest.provider/person/2");
这里先来写个例子,用来获取通讯录中的信息吧。新建ContentProviderTest工程,因为模拟器的联系人还没有创建,这里先添加几个好友:

\

接着我们继续编写代码,先在layout中添加listview,因为通讯录一般都是用listview来实现的。代码如下:

 

<!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E-->
<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" tools:context="com.example.jared.contentprovidertest.MainActivity">

    <listview android:id="@+id/contacts" android:layout_height="match_parent" android:layout_width="match_parent">

</listview></linearlayout>

这里就简单地加了一个listview,接着修改MainAcitivity代码:

 

package com.example.jared.contentprovidertest;

import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView contactViews;

    ArrayAdapter adapter;
    List contactList = new ArrayList();

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

        contactViews = (ListView)findViewById(R.id.contacts);
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, contactList);
        contactViews.setAdapter(adapter);
        readContacts();
    }

    public void readContacts() {
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, null, null, null);
            while(cursor.moveToNext()) {
                String ContactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String ContactPhoneNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactList.add(ContactName+'\n'+ContactPhoneNum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(cursor != null){
                cursor.close();
            }
        }
    }
}

这里用了string类型的适配器,然后通过cursor来获取联系人名字和电话号码,其中的名字和电话的定义最终也是字符串。
String DISPLAY_NAME = "display_name";
String NUMBER = "number";
这个和数据库的存取很类似,接着在AndroidManifest中添加权限:
然后运行app,效果如下:

 

\
 

由上可知,获得了三个联系人的信息,也就是我们刚保存的信息。

接着学习自定义的ContentProvider,这里借用了dbtest中的MyDBHelper类,新建myContenProvider类,代码如下:

 

package com.example.jared.contentprovidertest;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;

/**
 * Created by jared on 16/2/15.
 */
public class myContentProvider extends ContentProvider {

    public static final int PERSON_DIR = 0;
    public static final int PERSON_ITEM = 1;
    public static final int TEACHER_DIR = 2;
    public static final int TEACHER_ITEM = 3;

    private static UriMatcher uriMatcher;
    private static final String AUTHORITY = "com.example.jared.contentprovidertest.provider";

    private MyDBHelper myDBHelper;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "person", PERSON_DIR);
        uriMatcher.addURI(AUTHORITY, "person/#", PERSON_ITEM);
        uriMatcher.addURI(AUTHORITY, "teacher", TEACHER_DIR);
        uriMatcher.addURI(AUTHORITY, "teacher/#", TEACHER_DIR);
    }
    @Override
    public boolean onCreate() {
        myDBHelper = new MyDBHelper(getContext(), "PersonStore.db", null, 2);
        return true;
    }

    @Override
    public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
        SQLiteDatabase db = myDBHelper.getWritableDatabase();
        int updateRows = 0;
        switch (uriMatcher.match(uri)) {
            case PERSON_DIR:
                updateRows = db.update("person", contentValues, s, strings);
                break;
            case PERSON_ITEM:
                String personId = uri.getPathSegments().get(1);
                updateRows = db.update("person", contentValues, "id = ?", new String[]{personId});
                break;
            case TEACHER_DIR:
                updateRows = db.update("teacher", contentValues, s, strings);
                break;
            case TEACHER_ITEM:
                String teacherId = uri.getPathSegments().get(1);
                updateRows = db.update("teacher", contentValues, "id = ?", new String[]{teacherId});
                break;
            default:
                break;
        }
        return updateRows;
    }

    @Override
    public int delete(Uri uri, String s, String[] strings) {
        SQLiteDatabase db = myDBHelper.getWritableDatabase();
        int deleteRows = 0;
        switch (uriMatcher.match(uri)) {
            case PERSON_DIR:
                deleteRows = db.delete("person", s, strings);
                break;
            case PERSON_ITEM:
                String personId = uri.getPathSegments().get(1);
                deleteRows = db.delete("person", "id = ?", new String[]{personId});
                break;
            case TEACHER_DIR:
                deleteRows = db.delete("teacher", s, strings);
   



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-26VS2015墙内创建ionic2 【利用nrm更换源,完美!】,vs2015ionic2
  • 2017-05-26微博API常用方法,博API常用方法
  • 2017-05-26Android 手机卫士--导航界面2,android卫士
  • 2017-05-26Android开发笔记(6)——类的设定与继承,android笔记
  • 2017-05-26lesson15-QT多线程
  • 2017-05-26Android之网络编程利用PHP操作MySql插入数据(四),androidmysql
  • 2017-05-26Android属性动画
  • 2017-05-26DataPicker以及TimePicker显示时间和日期(屏幕上显示),datepicker日期格式
  • 2017-05-26Webview内存泄漏解决办法1,webview泄漏
  • 2017-05-26Android中View自定义XML属性详解以及R.attr与R.styleable的区别

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • HTTP 首部字段详细介绍,首部字段详细介绍
    • Android IPC机制(五)用Socket实现跨进程聊天程序
    • 安卓中Paint类和Canvas类的方法汇总,安卓中canvas
    • Android开发学习—— 创建项目时,不是继承activity,而是继承ActionBarActivity,androidactivity继承
    • 使用Merge INTO优化SQL,性能提升巨大
    • 界面底部Tab实现,界面Tab实现
    • Android新手入门2016(12)--基于Layout文件的AlertDialog
    • Android 手机卫士1--实现splash页面,androidsplash
    • BadgeView使用,jsbadgeview使用方法
    • AndroidTV版(乐视超3 X55)root,将自己的软件设置为开机自启、系统软件,卸载系统应用等问题总结,androidtvx55

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有