自定义ContentProvider需要在项目清单中注册:

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.provider.UserDictionary.Words;

public class DictProvider extends ContentProvider{
  private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
  private static final int WORDS = 1;
  private static final int WORD = 2;
  private MyDatabaseHelper dbOpenHelper;
  static{
    //为UriMatcher注册两个Uri
    matcher.addURI(mediaprovidertest.Words.AUTHORITY, "words", WORDS);
    matcher.addURI(mediaprovidertest.Words.AUTHORITY, "word/#", WORD);
  }

  //第一次调用该DictProvider时,系统先创建DictProvider对象,并回调该方法
  @Override
  public boolean onCreate() {
    dbOpenHelper = new MyDatabaseHelper(this.getContext(),"myDict.db3",null,1);
    return true;
  }

  //查询数据的方法
  @Override
  public Cursor query(Uri uri, String[] projection, String selection,
    String[] selectionArgs, String sortOrder) {
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    switch (matcher.match(uri)) {
      case WORDS:
        //执行查询
        return db.query("dict", projection,
            selection, selectionArgs, null, null, sortOrder);
      case WORD:
        //解析出想查询的记录ID
        long id = ContentUris.parseId(uri);
        String where =mediaprovidertest.Words.Word._ID+"="+id;
        //如果原来的where子句存在,拼接where子句
        if(selection != null && "".equals(selection)){
          where = where + " and "+selection;
        }
        return db.query("dict", projection, where, selectionArgs,
                null, null, sortOrder);

      default:
        throw new IllegalArgumentException("未知Uri:"+uri);
     }
  }

  //返回指定Uri参数对应的数据的MIME类型
  @Override
  public String getType(Uri uri) {
    switch (matcher.match(uri)) {
      //如果操作的数据是多项记录
      case WORDS:
        return "vnd.android.cursor.dir/org.crazyit.dict";
      //如果操作的数据时单项记录
      case WORD:
        return "vnd.android.cursor.item/org.crazyit.dict";
      default:
        throw new IllegalArgumentException("未知Uri:"+uri);
    }
  }

  //插入数据
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    // 获得数据库实例
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    //插入数据,返回行ID
    long rowId = db.insert("dict", mediaprovidertest.Words.Word._ID, values);
    //如果插入成功则返回uri
    if(rowId>0){
      //在已有的Uri的后面追加ID数据
      Uri wordUri = ContentUris.withAppendedId(uri, rowId);
      //通知数据已经改变
      getContext().getContentResolver().notifyChange(wordUri, null);
      return wordUri;
    }
    return null;
  }

  //删除数据的方法
  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    //记录所删除的记录数
    int num = 0;
    //对Uri进行匹配
    switch (matcher.match(uri)) {
      case WORDS:
        num = db.delete("dict", selection, selectionArgs);
        break;
      case WORD:
        //解析出所需要删除的记录ID
        long id = ContentUris.parseId(uri);
        String where = mediaprovidertest.Words.Word._ID+"="+id;
        //如果原来的where子句存在,拼接where子句
        if(selection != null && selection.equals("")){
          where = where +" and "+selection;
        }
        num = db.delete("dict", where, selectionArgs);
        break;
    default:
      try {
        throw new IllegalAccessException("未知Uri:"+uri);
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
    //通知数据已经改变
    return num;
  }

  //修改数据的方法
  @Override
  public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
    SQLiteDatabase db = dbOpenHelper.getWriteDatabase();
    //记录所修改的记录数
    int num = 0;
    switch (matcher.match(uri)) {
      case WORDS:
        num = db.update("dict", values, selection, selectionArgs);
        break;
      case WORD:
        //解析出想修改的记录ID
        long id = ContentUris.parseId(uri);
        String where = mediaprovidertest.Words.Word._ID+"="+id;
        //如果原来的where子句存在,拼接where子句
        if(selection != null && selection.equals("")){
          where = where +" and "+selection;
        }
        num = db.update("dict", values, where, selectionArgs);
      default:
        throw new IllegalArgumentException("未知Uri:"+uri);
     }
    //通知数据已经改变
    getContext().getContentResolver().notifyChange(uri, null);
      return 0;
   }

}

使用ContentProContentProvider共享生词本数据的更多相关文章

  1. PHP 实现多网站共享用户SESSION 数据解决方案

    PHP 实现多网站共享用户SESSION 数据解决方案 来源URL:http://blog.csdn.net/dongdongzzcs/article/details/6906613 一.问题起源 稍 ...

  2. 【Excle数据透视表】如何创建非共享缓存的数据透视表

    一般情况下,利用同一个数据源创建多个数据表时,默认创建的是共享缓存的数据透视表.刷新一个数据透视表时会影响其他数据透视表的展示结果. 解决方案 创建非共享缓存的多个数据透视表 步骤一 单击工作表数据任 ...

  3. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

  4. 【CUDA 基础】5.2 共享内存的数据布局

    title: [CUDA 基础]5.2 共享内存的数据布局 categories: - CUDA - Freshman tags: - 行主序 - 列主序 toc: true date: 2018-0 ...

  5. session共享原理以及PHP 实现多网站共享用户SESSION 数据解决方案

    参考自: http://www.cnblogs.com/qulinke/articles/6003049.html https://segmentfault.com/q/101000000578847 ...

  6. 大数据freestyle: 共享单车轨迹数据助力城市合理规划自行车道

    编者按:近年来,异军突起的共享单车极大地解决了人们共同面临的“最后一公里”难题,然而,共享单车发展迅猛,自行车道建设却始终没有能够跟上脚步.幸运的是摩拜单车大量的轨迹数据为我们提供了一种新的思路:利用 ...

  7. 011.Kubernetes使用共享存储持久化数据

    本次实验是以前面的实验为基础,使用的是模拟使用kubernetes集群部署一个企业版的wordpress为实例进行研究学习,主要的过程如下: 1.mysql deployment部署, wordpre ...

  8. 在Owin Self-Hosing下实现每个请求中共享上下文(数据)

    问题 这几天在做公司的外部WebApi网关,由于使用了OAuth2.0,所以不得不使用Owin来部署网关. 而涉及到请求上下文的问题,为了使业务层能获取到请求头的信息,又不与网关耦合,决定把请求信息写 ...

  9. Unity 3D Framework Designing(5)——ViewModel之间如何共享数据

    对于客户端应用程序而言,单页应用程序(Single Page Application)是最常见的表现形式.有经验的开发人员往往会把一个View分解多个SubView.那么,如何在多个SubView之间 ...

随机推荐

  1. [转载] zookeeper 事件通知

    ZK事件回调当一个client访问ZK时,client与ZK保持长连接.应用可以通过client的api注册一些callback,当对应的事件发生时,client会执行对应的callback.如果你基 ...

  2. (三)NAND flash和NOR flash的区别详解

    我们使用的智能手机除了有一个可用的空间(如苹果8G.16G等),还有一个RAM容量,很多人都不是很清楚,为什么需要二个这样的芯片做存储呢,这就是我们下面要讲到的.这二种存储设备我们都统称为“FLASH ...

  3. 关于Socket的经验小结

    前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...

  4. Java Ant build.xml详解

    1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因为 ...

  5. JQuery $()后面的括号里的内容什么时候加引号,什么时候不加

    一.如果是已经声明存在的变量或者对象,就不用加引号. 比如var name=document.getElementById("name"); $(name)或者$(this). 二 ...

  6. mysql ERROR 1044 (42000): Access denied for user ''@'localhost' to database

    新安装的mysql密码是空的. ./mysql -u root -p use mysql SELECT `Host`,`User` FROM user; UPDATE user SET `Host` ...

  7. struct和class

    先概述一下: 1.C# 是纯面向对象语言,struct 与 class 都是继承Object,都是对象.struct 是值类型.class 是引用类型. 2.struct是值类型,在Stack上分配地 ...

  8. s3c2440 J-flash 烧写 NOR flash

    视屏教程里是在NOR Flash 烧写了一个supervivi然后通过superViVi配合DNW下载Uboot程序到landflash第零块,由于我电脑室64位win7,官方提供的USB下载驱动不能 ...

  9. hiho_1067_最近公共祖先2

    题目大意 给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先. 题目链接最近公共祖先 分析 数据量大,根据题目提示,采用Tarjan + 并 ...

  10. linux删除文件未释放空间问题处理

    linux删除文件未释放空间问题处理 或者 /根分区满了 (我的根分区是/dev/sda1,/dev/sda1满了) http://blog.csdn.net/donghustone/article/ ...