内容提供者编写步骤

1. 写一个类继承系统的ContentProvider

2. 在清单文件中注册

    <provider
            android:name="com.example.bank.BankProvider"
            android:authorities="tian.wang.gai.di.hu" >
    </provider>

3. 暗号 URI

     static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
      static{
           //添加URI的匹配规则
           matcher.addURI("tian.wang.gai.di.hu", "bao.ta.zhen.he.yao",URI_SUCC);
      }

4. 实现数据的增删改查的操作

package com.example.bank;
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;
/**
 * 1. 写一个类继承系统的ContentProvider
 *
 * 数据库管理员
 *  双面间谍
 */
public class BankProvider extends ContentProvider {
   private static final int URI_SUCC = 0;
   private static final int URI_SUCC_QUERY  = 1;
   private static final int URI_SUCC_ACCOUNT   = 2;
   private static final int URI_SUCC_BALC   = 3;
   private BankDbOpenHelper helper;
   private SQLiteDatabase   db;
  //3. 暗号  URI
   static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
   static{
      //添加URI的匹配规则
      matcher.addURI("tian.wang.gai.di.hu", "bao.ta.zhen.he.yao",URI_SUCC);
      //添加URI的匹配规则   用方法名  query
      matcher.addURI("tian.wang.gai.di.hu", "query",URI_SUCC_QUERY);
      //添加URI的匹配规则   用方法名  account 表名  推荐使用
      matcher.addURI("tian.wang.gai.di.hu", "account",URI_SUCC_ACCOUNT);
      //添加URI的匹配规则   用方法名  black 表名  推荐使用
      matcher.addURI("tian.wang.gai.di.hu", "black",URI_SUCC_BALC);
      //添加URI的匹配规则   用方法名  account/2
      matcher.addURI("tian.wang.gai.di.hu", "account/2",URI_SUCC_ACCOUNT);
/添加URI的匹配规则   用方法名  account/#
      matcher.addURI("tian.wang.gai.di.hu", "account/#",URI_SUCC_ACCOUNT);
  }
   @Override
   public boolean onCreate() {
      helper = new BankDbOpenHelper(getContext());
      db = helper.getWritableDatabase();
      return false;
   }
   @Override
   public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
      int code = matcher.match(uri);
      if (code == URI_SUCC_QUERY) {
         Cursor cursor = db.query("account", projection, selection, selectionArgs, null, null, sortOrder);
         //发出通知
         getContext().getContentResolver().notifyChange(uri, null);
         return cursor;
      }else if(code == URI_SUCC_BALC){
         Cursor cursor = db.query("black", projection, selection, selectionArgs, null, null, sortOrder);
         return cursor;
      }else {
         throw new IllegalArgumentException("根据相关的法律规定,您无权操作银行数据库!") ;
      }
   }
   /**
    *  vnd.android.cursor.item 单行数据
      vnd.android.cursor.dir/ 多行数据库
    */
   @Override
   public String getType(Uri uri) {
      return null;
   }
/**
    * 4. 实现增的方法
    *
    * content://tian.wang.gai.di.hu/bao.ta.zhen.he.yao
    *
    */
   @Override
   public Uri insert(Uri uri, ContentValues values) {
      int code = matcher.match(uri);
      if (code == URI_SUCC) {
         //行长操作的数据库
         long id = db.insert("account", null, values);
         //发出通知
         getContext().getContentResolver().notifyChange(uri, null);
         return Uri.parse("id:"+id);
      }else if(code == URI_SUCC_BALC){
         long id = db.insert("black", null, values);
         return Uri.parse("id:"+id);
      }else {
         throw new IllegalArgumentException("根据相关的法律规定,您无权操作银行数据库!") ;
      }
   }
   @Override
   public int delete(Uri uri, String selection, String[] selectionArgs) {
      int code = matcher.match(uri);
      if (code == URI_SUCC_ACCOUNT) {
         int id = db.delete("account", selection, selectionArgs);
         //发出通知
         getContext().getContentResolver().notifyChange(uri, null);
         return id;
      }else if(code == URI_SUCC_BALC){
         int id = db.delete("black", selection, selectionArgs);
         return id;
      }else {
         throw new IllegalArgumentException("根据相关的法律规定,您无权操作银行数据库!") ;
      }
   }
   @Override
public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
      int code = matcher.match(uri);
      if (code == URI_SUCC_ACCOUNT) {
         int id = db.update("account", values, selection, selectionArgs);
         //发出通知
         getContext().getContentResolver().notifyChange(uri, null);
         return id;
      }else if(code == URI_SUCC_BALC){
         int id = db.update("black", values, selection, selectionArgs);
         return id;
      }else {
         throw new IllegalArgumentException("根据相关的法律规定,您无权操作银行数据库!") ;
      }
   }
}

package com.example.bank;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class BankDbOpenHelper extends SQLiteOpenHelper {
   /**
    * 构造方法
    *
    * @param context
    *            上下文
    * @param name
    *            数据库的名称
    * @param factory
    *            游标工厂 null
    * @param version
    *            数据库的版本号 >= 1
    */

   public BankDbOpenHelper(Context context) {
      super(context,"bank.db",null,2);
   }
   /**
    * 第一次创建数据库的时候调用
    * 适合做一些初始化的事情
    */
   @Override
   public void onCreate(SQLiteDatabase db) {
      db.execSQL("create table account(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
   }

   /**
    * 升级数据库的时候调用
    */
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      db.execSQL("create table black(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
   }
}
时间: 2024-12-29 10:14:26

内容提供者编写步骤的相关文章

调用另一个工程中内容提供者的步骤

1. 获取内容解析器 ContentResolver resolver = this.getContentResolver(); 2. 指定URI Uri uri = Uri.parse("content://tian.wang.gai.di.hu/bao.ta.zhen.he.yao"); 3. 操作银行数据库 ContentValues values = new ContentValues(); values.put("name", "张三"

内容提供者学习笔记

##内容提供者笔记## ###步骤### 1.创建实现了ContentProvider的子类MyContentProvider并重写父类的方法 2.作为android四大组件之一,要在manifest.xml文件中注册provider标签 <provider             android:name="cn.itcast.db.MyContentProvider"             android:authorities="cn.itcast.db.per

android之内容提供者解析

该系统有两个应用,比较繁琐.但是内容提供者是android里非常非常重要的一个内容,我们得好好学习下哦.先看效果图,我们提供了四个按钮,点击按钮便会进行相应的操作. 我们先看内容提供者所在的应用,代码结构: activity代码: [java] view plaincopy package cn.com.contentProvider; import android.app.Activity; import android.os.Bundle; import android.widget.Tex

Android基础笔记(十三)- 内容提供者原理和简单使用

为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信 为什么要有内容提供者 内容提供者技术的目的是: 把私有数据库的数据的内容暴露给外部使用: 我们知道,微信.QQ等应用都可以读取手机中联系人和短信的数据.而联系人和短信都是系统内置的应用,它们的数据都存储在相应的数据库中. 在com.android.provider.telephony/databases/mmssms.db就是短信的数据库,通过下

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

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

Android组件系列----ContentProvider内容提供者

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4108017.html 联系方式:[email protected] [正文] 一.ContentProvider简介: ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider可以理解为一个Android应用对外开放的

Android四大基本组件(2)之Service 服务与Content Provider内容提供者

一.Service 服务: 一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序. 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器.在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲.然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的.在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从

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

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

【android基础篇】利用内容提供者实现短信备份

I,准备工作 系统存储短信内容的目录为:/dada/dada/com.android.providers.telephony/databases/mmssms.db,我们找到对应的数据库文件. 我们可以发现该文件对于第三方而言,是不可读不可写的,这里则必须要使用内容提供者. 问题就来了:我不知道主机名,也就无法作为中间人去找证监会打探消息.其实,完全没有关系,我们可以翻阅安卓的源代码: \packages\providers\TelephonyProvider的清单文件,因为主机名都配置在清单文