`
Kinphoo
  • 浏览: 9089 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android

 
阅读更多
http://llb988.blog.51cto.com/1940549/516909
Android内容提供者源码,我不想说多,只讲一些实用的代码,增删改查。通过contentProvider向数据进行操作。大家可以下载,通过日志与LogCat打印出来的信息作为参考! 

package com.smart; 


import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.util.Log; 

public class ContentProvider extends Activity { 
  private static final String TAG = "ContentProvider"; 
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
//      通过这个类,方问DB项目 
      ContentResolver contentResolver = this.getContentResolver(); 
      Uri alluri = Uri.parse("content://com.smart.provider.personprovider/person"); 
//      Uri uri = Uri.parse("content://com.smart.provider.personprovider/person"); 
      ContentValues values = new ContentValues(); 
      values.put("name", "smart99"); // 这里更改就可以了。/ 
      values.put("age", (short)44); 
//      contentResolver.insert(uri, values); //增加 
       
      Uri uri = Uri.parse("content://com.smart.provider.personprovider/person/5"); 
//      contentResolver.update(uri, values, null, null);//更新 
//      contentResolver.delete(uri, null, null);//删除 
       
       
       
      //查询 
//      Cursor cursor = contentResolver.query(uri, new String[] { 
//        "personid", "name", "age" }, null, null, "personid desc"); 
//      while (cursor.moveToNext()) { 
//       Log.i(TAG, 
//         "personid=" + cursor.getInt(0) + ",name=" 
//           + cursor.getString(1) + ",age=" 
//           + cursor.getShort(2)); 
//      } 
//      cursor.close(); 
//      记得要关掉数据 
       
      //01:19 
       
      contactMethod(); 
    } 
    //读取通迅里的人员。 
public void contactMethod(){ 
//联系人,/媒体库/ 
ContentResolver contentResolver = this.getContentResolver(); 
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
  
while (cursor.moveToNext()) { 
   
  int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
  String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
  Log.i(TAG,"contactId=" + contactId + ",name="
      + name); 
   
   
  Cursor phones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
    null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null); 
  StringBuffer sb=new StringBuffer(); 
  while(phones.moveToNext()){ 
   String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
  sb.append(phoneNumber).append(","); 
   

  //电话号码可以得到 
  Log.i(TAG, sb.toString()); 
  

  
cursor.close(); 
  

     
     






package com.smart.dh; 

import android.content.ContentProvider; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.content.UriMatcher; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.net.Uri; 
import android.text.TextUtils; 

import com.smart.service.DataBaseOpenHelper; 

/** 
* 使用内容提供者 
ContentProvider共享数据 
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法 
就可以向其它应用共享其数据。虽然使用其它方法对外共享数据,但是数据访问 
方式 会因数据存储的方式而不同。,而采用文件操作读写数据,采用sharedoreferences共享数据的需要使用sharedpreferences API读写数据,而使用ContentProvider共享数据的好处 
好处是统一了数据访问方式,当应用需要通过ContentProvider对外共享 数据时,第一步需要继承ContentProvider并重写下面的方法。 
Public class PersonContentProvider extends ContentProvider{ 
Public boolean onCreate(); 
Public Uri insert(Uri uri,ContentValues values); 
Public int delete(Uri uri,String selection,String[] selectionArgs); 
Public int update(Uri uri,ContentValues values,String selection,String selectionArgs); 
Pullic Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String softOrder); 
Public String getType(Uri uri); 


第二步需要在AndroidMandifest.xml使用<provider>对该ContentProvider进行配置,为了能让其它应用找到该ContentProvider,ContentProvider采用了authorites(主机名、域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorites就是他的域名: 
下面是在要注册信息 
<appli…> 
<provider android:name=”.类名” android:authorities=”con.smart.provider.包名”> 

</appli> 

注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider内容提供者 

* ContentProvider来自于文件与数据库都可以 
*  
* Uri介绍 
* Uri代表了要操作的数据,Uri主要包含了两部信息:1》 
* 需要操作的ContentProvider,2> 
* 对ContentProvider中的,什么数据进行操作, 一个Uri由以下几个部分组成。 
* content:// com.smart.provider.personperovider/person/988 
*  content://  指 scheme   
*  om.smart.provider.personperovider指 主机名或authority 
*  person  指路径 
*  988  指ID 
* */
public class PersonContentProvider extends ContentProvider { 
// 另一个工程,方问这一个类。 

private DataBaseOpenHelper dbOpenHelper; 
private static final int ALLPERSON = 1; 
private static final int PERSON = 2; 
private static UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 任何不匹配的时候,返回为-1 
static { 
//   
  sMatcher.addURI("com.smart.provider.personprovider", "person",ALLPERSON); 
   
  sMatcher.addURI("com.smart.provider.personprovider", "person/#", PERSON); 

//删除 
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) { 
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
  int count = 0;// 返回的行数 
  switch (sMatcher.match(uri)) { 
  case ALLPERSON: 
   count = db.delete("person", selection, selectionArgs); 
   break; 
  case PERSON: 
   long personid = ContentUris.parseId(uri); 
   String where = TextUtils.isEmpty(selection) ? "personid=?"
     : selection + " and personid=?"; 
   String[] params = new String[] { String.valueOf(personid) }; 
   if (!TextUtils.isEmpty(selection) && selectionArgs != null) { 
    params = new String[selectionArgs.length + 1]; 
    for (int i = 0; i < selectionArgs.length; i++) { 
     params[i] = selectionArgs[i]; 
    } 
    params[selectionArgs.length + 1] = String.valueOf(personid); 
   } 
   count = db.delete("person", where, params); 
   break; 
  default: 
   throw new IllegalArgumentException("Unkow Uri:" + uri); 
  } 
  return count; 

  
/** 
  * public String getType(Uri uri) 
  * 方法用于返回URI所代表数据的MIME类型,如果操作的数据发球集合类型,哪么MIME类型 
  * 字符串应该以vnd.android.cursor.dir/开头,要得到所有的person记录Uri为, 
  * ontent//com.smart.domain/person 哪么返回MIME类型字符串应该为, 
  * vnd.android.cursor.item/开头,比如,得到的ID为1的person记录,URI为 
  * ontent//com.smart.domain/person/10 ,哪么返回的MIME类型字符串应该为 
  * vnd.android.cursor.item/person 
  * */
// 操作数据类型 
@Override   //这个方法,不实现也可以的。 
public String getType(Uri uri) { 
  switch (sMatcher.match(uri)) { 
  case ALLPERSON: 
   //多条 
   return "vnd.android.cursor.dir/personprovider.person"; 
  case PERSON: 
   //personprovider.person  内容提供表的 
   //单条 
   return "vnd.android.cursor.item/personprovider.person"; 
  default: 
   throw new IllegalArgumentException("Unkow Uri:" + uri); 
  } 


/** 
  * UriMatcher类的使用介绍 因为URI代表了要操作的数据,所以我们很经常需要解析URI,并从URI中获得取数据,ANDROID系统 
  * 提供了两个用于操作URI的工具类,分别为URIMATCHER和CONTENTURIS。掌握它们的使用,会便于我们的开发工作, 
  * URIMATCHER类于匹配URI。它的用法如下。 首先第一步把你需要匹配路径全部给注册上,如下 常量 
  * UriMatcher.NO_MATCH表示不匹配任何路径的返回码 Urimatcher sMatcher=new 
  * UriMatcher(UriMatcher.NO_MATCH); 
  * 如果match()方法匹配content//com.smart.domain/person 路径,返回匹配为1 
  * sMatcher.addURI(content//com.smart.domain/person/1); 
  * 如果match()方法匹配content//com.smart.domain/person/230 路径,返回匹配为2 
  * sMatcher.addURI(content//com.smart.domain/person/#,2); /#为通配符 
  *  
  * 这里讲一下,parse方法为任何的一个字符串转换为Uri地址 
  * switch(sMatcher.match(Uri.parse("content//com.smart.domain/person/10"))){ 
  *  
  * } 
  *  
  *  
  * 注册完需要匹配的URI后,就可以使用sMatcher.match(Uri)方法对输入进行匹配 ,如果匹配就返回匹配码 
  * 匹配码是调用ADDRUI()方法传入第三个参数,假设匹配 content//com.smart.domain/person 路径,返回的匹配码为1 
  *  
  * **/
//增加 
@Override
public Uri insert(Uri uri, ContentValues values) { 
  // 返回的类型为,返回一路径, 
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
  long id = 0; 
  // com.smart.domain/person/100 
  switch (sMatcher.match(uri)) { 
  case ALLPERSON: 
   // com.smart.domain/person/ 
   id = db.insert("person", "name", values);// 记是记录的行号,主健INT类,就是主健, 
   return ContentUris.withAppendedId(uri, id); 

  case PERSON: 
   // com.smart.domain/person/20 
   db.insert("person", "name", values); 
   String path = uri.toString(); 
   // 从0个开始,取到,com.smart.domain/person/20 前面20的一个'/' 
   return Uri.parse(path.substring(0, path.lastIndexOf('/')) + id); 
  default: 
   // 返回一个参数 
   throw new IllegalArgumentException("Unkow Uri:" + uri); 
  } 


  


@Override
public boolean onCreate() { 
  dbOpenHelper = new DataBaseOpenHelper(this.getContext()); 
  return true; 

//查询 
@Override
public Cursor query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder) { 
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
  switch (sMatcher.match(uri)) { 
  case ALLPERSON: 
  return db.query("person", projection, selection, selectionArgs,null,null,sortOrder); 
  case PERSON: 
   long personid = ContentUris.parseId(uri); 
   String where = TextUtils.isEmpty(selection) ? "personid=?"
     : selection + " and personid=?"; 
   String[] params = new String[] { String.valueOf(personid) }; 
   if (!TextUtils.isEmpty(selection) && selectionArgs != null) { 
    params = new String[selectionArgs.length + 1]; 
    for (int i = 0; i < selectionArgs.length; i++) { 
     params[i] = selectionArgs[i]; 
    } 
    params[selectionArgs.length + 1] = String.valueOf(personid); 
   } 
   return db.query("person", projection, where, params,null,null,sortOrder); 
  default: 
   throw new IllegalArgumentException("Unkow Uri:" + uri); 
  } 
   

//更新 
@Override
public int update(Uri uri, ContentValues values, String selection, 
   String[] selectionArgs) { 
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
  int count = 0;// 返回的行数 
  switch (sMatcher.match(uri)) { 
  case ALLPERSON: 
   count = db.update("person", values, selection, selectionArgs); 
   break; 
  case PERSON://com.smart.domain/100 
   long personid = ContentUris.parseId(uri);//得到100的记录 
   //判断是否为空,为条件 
   String where = TextUtils.isEmpty(selection) ? "personid=?"
     : selection + " and personid=?"; 
   String[] params = new String[] { String.valueOf(personid) }; 
   if (!TextUtils.isEmpty(selection) && selectionArgs != null) { 
    params = new String[selectionArgs.length + 1]; 
    for (int i = 0; i < selectionArgs.length; i++) { 
     params[i] = selectionArgs[i]; 
    } 
    params[selectionArgs.length + 1] = String.valueOf(personid); 
   } 
   count = db.update("person", values, where, params); 
   break; 
  default: 
   throw new IllegalArgumentException("Unkow Uri:" + uri); 
  } 
  return count; 

/***** 
  * 增加 ContentUris类用于获取Uri 路径后面的ID部分,它有两个实用的方法, 
  * withAppendedld(Uri,id)用于为路径为上ID部分 Uri 
  * uri=Uri.parse("content://com.smart.domain/person"); Uri 
  * resultUri=ContentUris.withAppendedld(uri,10) 
  * 生成后Uri为:content://com.smart.domain/person/10 
  *  
  * 更新的方法 parseld(uri)方法用于从路径中获取ID部分 Uri 
  * uri=Uri.parse("com.smart.domain/person/10"); long 
  * personid=ContentUris.parseld(uri);//获取的结果为10 
  *  
  *  
  * **/



<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.smart.dh"
      android:versionCode="1"
      android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <uses-library android:name="android.test.runner"/> 
       <provider android:name=".PersonContentProvider"
        android:authorities="com.smart.provider.personprovider"  
        android:permission="com.smart.provider.personprovider"/>  
      
        <activity android:name=".DBActivity"
                  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> 
    <uses-sdk android:minSdkVersion="8" /> 
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.smart.dh" android:label="Tests for My App"/> 
</manifest>  






   <!--  android:permission="cn.itcast.provider.personprovider"
        这行是指权限    android:permission="com.smart.domain"
        com.smart.domain 
        --> 
分享到:
评论

相关推荐

    android 经典代码例子

    在Android开发领域,经典代码例子是开发者学习和提升技能的重要资源。这些例子涵盖了各种关键功能和组件的实现,有助于深入理解Android应用的工作原理。在这个压缩包中,我们可能找到了多个有关Android编程的示例...

    Android开发入门60个小案例+源代码

    在Android开发领域,初学者经常会面临许多挑战,如理解Android应用程序的基本架构、学习XML布局、掌握Java或Kotlin编程语言,以及如何与设备硬件交互等。"Android开发入门60个小案例+源代码"这个资源提供了丰富的...

    Android省市区三级联动滚轮选择——Cascade_Master

    该组件是基于开源库`Android-wheel`实现的,`Android-wheel`是一个适用于Android的滚轮选择器,它可以创建类似于iOS中PickerView的效果,让用户通过滚动来选取所需的数据。在省市区三级联动中,当用户在一级(省)...

    Android自定义日期选择器源码

    在Android开发中,系统默认的日期和时间选择器虽然实用,但往往无法满足所有场景的需求。因此,开发者经常需要自定义日期选择器来提供更符合应用风格或特定功能的交互体验。这篇内容将深入探讨如何在Android中创建一...

    Android通过webservice连接Sqlserver实例

    在Android开发中,有时我们需要与远程数据库进行交互,例如SQLServer。这个场景通常是通过Web服务,如WebService来实现。本文将详细介绍如何在Android应用中利用WebService接口连接到SQLServer数据库,实现数据的增...

    Android串口通信(Android Studio)

    在Android开发中,串口通信(Serial Port Communication)是一种重要的技术,它允许设备之间通过串行接口进行数据交换。在Android Studio环境下实现串口通信,开发者可以构建与硬件设备交互的应用,例如读取传感器...

    Android组件设计思想

    Android应用开发的哲学是把一切都看作是组件。把应用程序组件化的好处是降低模块间的耦合性,同时提高模块的复用性。Android的组件设计思想与传统的组件设计思想最大的区别在于,前者不依赖于进程。也就是说,进程...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android 完美实现图片圆角和圆形

    在Android开发中,有时我们需要对显示的图片进行特殊处理,比如让图片呈现圆角或完全圆形。本知识点将深入探讨如何在Android应用中完美实现图片的圆角和圆形效果。 首先,我们来看如何实现图片的圆角效果。Android...

    Android.bp文件说明.pdf

    Android新编译规则Android.bp文件语法规则详细介绍,条件编译的配置案例。 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 ...

    JS调用Android方法,向Android方法传递json数据

    在现代的移动应用开发中,JavaScript与原生平台之间的交互变得越来越常见,特别是在使用Android的WebView组件时。本文将深入探讨如何使用JavaScript调用Android的方法,并传递JSON数据,以实现两者之间的高效通信。 ...

    Android扫雷游戏(基于Android Studio)

    【Android扫雷游戏开发详解】 在移动开发领域,Android Studio是Google推出的官方集成开发环境(IDE),用于构建Android应用程序。本项目"Android扫雷游戏"就是利用Android Studio进行开发的一个实例,旨在帮助初学...

    android应用开发范例精解

    第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...

    android 仿微信语音聊天demo

    【Android 微信语音聊天Demo】是一个典型的移动应用开发示例,主要展示了如何在Android平台上构建类似微信的语音聊天功能。这个Demo包含了按钮状态切换、语音录制、本地存储、回放和加载等一系列关键操作,是Android...

    Android SDK离线包合集(Android 4.0-5.0)

    Android SDK离线包合集(Android 4.0-5.0)。不用去Google下载,直接国内下载离线包,各版本文件独立,任意下载。手机流量上传了一部分,好心疼。如不能下载,请告诉我更新地址。 附上简单教程。 这是Android开发所...

    Android小项目集合100多个

    1. **Android SDK**:Android软件开发工具包(SDK)是开发Android应用的基础,包含了开发、调试和发布应用所需的所有工具,如Android Studio IDE、Java Development Kit(JDK)、模拟器以及各种版本的Android平台库...

    Android基于Socket聊天最终版

    在本项目中,“Android基于Socket聊天最终版”是一个实现了基于Socket通信的简易聊天应用,它模仿了QQ的一些功能。这个项目包含三个主要部分:服务器端、客户端和数据库管理。通过Socket编程,Android设备可以作为...

    Android 图片浏览全屏缩放

    在Android开发中,实现图片浏览的全屏缩放效果是一项常见的需求,特别是在社交应用中,如QQ好友动态和微信朋友圈。这种功能不仅需要提供良好的用户体验,还需要考虑性能和内存优化,因为图片通常较大,处理不当可能...

Global site tag (gtag.js) - Google Analytics