使用ContentProContentProvider共享生词本数据

自定义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;
   }

}

时间: 2024-08-10 00:05:34

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

Docker(5)-共享和持久化数据

Docker为我们提供了两种方法来共享和持久化数据: Data Volumes Data Containers 数据卷 数据卷有时被简单的称为卷,是存储在主机上的目录,从容器的根文件系统中可以直接访问到它.它不仅可以持久化容器中生成的数据,而且可以实现容器与容器之间,容器与主机之间的数据共享. 要配置数据卷,我们可以在docker命令中使用-v选项并指定卷名.例如: docker run -it -v /mydir --name first ubuntu /bin/bash ls一下,可以看到在

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

一般情况下,利用同一个数据源创建多个数据表时,默认创建的是共享缓存的数据透视表.刷新一个数据透视表时会影响其他数据透视表的展示结果. 解决方案 创建非共享缓存的多个数据透视表 步骤一 单击工作表数据任意区域→插入→数据透视表→新工作表→确定→单击数据透视表→拖动字段后建立数据透视表 步骤二 按下[ALT+D+P]组合键→数据透视表→下一步→选定区域→下一步→弹窗(选择否)→现有工作表→完成

共享带宽明细数据导出及数据挖掘洞察

摘要: 共享带宽支持增强95计费和传统95计费模式,这两种计费模式会出月账单.月账单如果金额较大,用户会有对账需求.对账是指用户需要详细的看一下共享带宽实例上的带宽消耗情况.共享带宽支持了上个月的带宽明细数据的导出功能以便用户进行带宽数据的核对. 共享带宽采样点数据明细导出功能共享带宽支持增强95计费和传统95计费模式,计费模式详情请参考,共享带宽计费模式. 其中最终的月95带宽值的计算是基于每5分钟的带宽采样点的带宽值数据而计算得出. 目前新增了导出上个月共享带宽实例的每5分钟采样点带宽峰值的

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

本次实验是以前面的实验为基础,使用的是模拟使用kubernetes集群部署一个企业版的wordpress为实例进行研究学习,主要的过程如下: 1.mysql deployment部署, wordpress deployment部署, wordpress连接mysql时,mysql的 pod ip易变 2.为mysql创建 service,申请固定 service lp 3. wordpress外部可访问,使用 node port类型的 service 4. nodeport类型的 service

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

问题 这几天在做公司的外部WebApi网关,由于使用了OAuth2.0,所以不得不使用Owin来部署网关. 而涉及到请求上下文的问题,为了使逻辑层能获取到请求头的信息,又不与网管耦合,决定把请求信息写到一个访问上下文中. 在传统的Http部署下,这个问题很好解决,我们可以使用HttpContext或者CallContext都是可行的. 然而在Owin的Self-Hosting情况下,这两者都无法使用. 在网上检索了一下,找到了很完善的解决方法.记录分享一下. 解决方案 方法一: 使用OwinCo

Java线程范围内的共享数据(2)

实际上那么Map也就是模拟的ThreadLocal 每一个线程调用全局的ThreadLocal对象的set方法,就相当于往其内部的map记录新的键值对,键是Thread.current,值是data 线程结束后,可以选择调用ThreadLocal的clear()方法,释放内存,当某一个线程死掉后,可以用remove()移走 相关的变量,但是问题是,如何监听得知某个线程即将死亡? ThreadDeadRequest事件,只说了一点,太含糊,求解惑? import java.util.Random;

Session(数据)共享的前后端分离Shiro实战

1,前言 本文期望描述如何使用Shiro构建基本的安全登录和权限验证.本文实战场景有如下特殊需求:1,在集群和分布式环境实现session共享:2,前端只使用HTML/CSS/JS.因此无法直接使用Shiro提供的SessionManager,以及Shiro针对web应用提供的Filter拦截方式.当然,除非是一定要通过共享缓存的方式共享session,否则还是使用Shiro默认的session管理,毕竟增加独立缓存就意味着维护成本的提高和可用性的下降. 2, Shiro架构 首先一睹官方给出的

多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量. 1.下图和辅助代码解释ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据. 2.每个线程调用全局ThreadLocal

Android 多个activity之间的共享数据

最近打算做一个时间助手,一个service监听课表信息.课表信息可以通过另外的activity来设置,所以这里就涉及到了数据的同步问题.我设置后的信息必须同步到监听的信息去. 在java中我们用全局变量来完成这样子的任务,android提供了另外的方法,叫ApplicationContext. 首先,创建一个数据类MyAppData继承Application,然后在mainifest声明:在application标签里面加入 android:name=".MyAppData"就可以.通