当前位置: 首页 > news >正文

Android 内容提供者的实现

接着上文《Android 内容提供者简介》进一步实现内容提供者。

每个Content Provider类都使用URI(Universal Resource Identifier,通用资源标识符)作为独立的标识,格式如:content://com.example.app.provider/table1。其他应用程序通过不同的uri访问不同的内容提供者,并获取/操作里面的数据。

例如在本项目中对应如下URI:

content://com.wuyudong.db.personprovider/insert 添加的操作
content://com.wuyudong.db.personprovider/delete 删除的操作
content://com.wuyudong.db.personprovider/update 更新的操作
content://com.wuyudong.db.personprovider/query 查询的操作

在PersonDBProvider.java中添加代码:

package com.wuyudong.db;


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;

public class PersonDBProvider extends ContentProvider {

    // 定义一个URI的匹配器用于匹配uri, 如果路径不满足条件 返回-1
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int INSERT = 1;
    private static final int DELETE = 2;
    private static final int UPDATE = 3;
    private static final int QUERY = 4;
    private PersonSQLiteOpenHelper helper; 

    static {
        // 添加一组匹配规则 com.wuyudong.db.personprovider
        matcher.addURI("com.wuyudong.db.personprovider", "insert",
                INSERT);
        matcher.addURI("com.wuyudong.db.personprovider", "delete",
                DELETE);
        matcher.addURI("com.wuyudong.db.personprovider", "update",
                UPDATE);
        matcher.addURI("com.wuyudong.db.personprovider", "query", QUERY);
    }

    @Override
    public boolean onCreate() {

        helper = new PersonSQLiteOpenHelper(getContext());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        if (matcher.match(uri) == QUERY) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
        }
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

}

新建一个名为other的项目,布局如下:

<RelativeLayout 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"
    tools:context=".MainActivity" >

    <Button
        android:onClick="click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取DB的数据" />

</RelativeLayout>

点击下图的按钮,kill掉 com.wuyudong.db进程

点击Button按钮后,com.wuyudong.db进程重新运行,而且打印数据库中person表中的数据

进一步完善其他操作,修改布局

<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=".MainActivity" >

    <Button
        android:onClick="click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取DB的数据" />
     <Button
        android:onClick="delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除DB的数据" />
      <Button
        android:onClick="update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改DB的数据" />
       <Button
        android:onClick="insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加DB的数据" />

</LinearLayout>

接下来实现PersonDBProvider中的其他方法

package com.wuyudong.db;

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;

public class PersonDBProvider extends ContentProvider {

    // 定义一个URI的匹配器用于匹配uri, 如果路径不满足条件 返回-1
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int INSERT = 1;
    private static final int DELETE = 2;
    private static final int UPDATE = 3;
    private static final int QUERY = 4;
    private PersonSQLiteOpenHelper helper;

    static {
        // 添加一组匹配规则 com.wuyudong.db.personprovider
        matcher.addURI("com.wuyudong.db.personprovider", "insert", INSERT);
        matcher.addURI("com.wuyudong.db.personprovider", "delete", DELETE);
        matcher.addURI("com.wuyudong.db.personprovider", "update", UPDATE);
        matcher.addURI("com.wuyudong.db.personprovider", "query", QUERY);
    }

    @Override
    public boolean onCreate() {

        helper = new PersonSQLiteOpenHelper(getContext());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        if (matcher.match(uri) == QUERY) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.query("person", projection, selection,
                    selectionArgs, null, null, sortOrder);
            return cursor;
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
        }
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        if (matcher.match(uri) == INSERT) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getWritableDatabase();
            db.insert("person", null, values);
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行插入操作");
        }
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        if (matcher.match(uri) == DELETE) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("person", selection, selectionArgs);
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行删除操作");
        }
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        if (matcher.match(uri) == UPDATE) {
            // 返回查询的结果集
            SQLiteDatabase db = helper.getWritableDatabase();
            db.update("person", values, selection, selectionArgs);
        } else {
            throw new IllegalArgumentException("路径不匹配,不能执行修改操作");
        }
        return 0;
    }

}

 

相关文章:

  • SQL注入攻防入门详解
  • 关于Linux cached内存简析
  • abrtd是什么进程
  • linux下定时任务的使用
  • chrome远程调试真机上的app
  • I.MX6 boot from Micro SD
  • iOS开发多线程篇 03 —线程安全
  • maven exclusions【jar包依赖注意】
  • 拥抱JPA规范
  • ChemDraw在苹果电脑上能不能用
  • 版本控制系统svn搭建
  • I.MX6 U-boot imxotp MAC address 写入
  • XJOI网上同步训练DAY1 T3
  • 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
  • phpStorm设置显示代码行号
  • 自己简单写的 事件订阅机制
  • Android 控件背景颜色处理
  • Cumulo 的 ClojureScript 模块已经成型
  • git 常用命令
  • Laravel 菜鸟晋级之路
  • NSTimer学习笔记
  • Shadow DOM 内部构造及如何构建独立组件
  • Sublime text 3 3103 注册码
  • vue-cli在webpack的配置文件探究
  • vue的全局变量和全局拦截请求器
  • 简析gRPC client 连接管理
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 用Visual Studio开发以太坊智能合约
  • 智能合约开发环境搭建及Hello World合约
  • 整理一些计算机基础知识!
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #if #elif #endif
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (14)Hive调优——合并小文件
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (黑马C++)L06 重载与继承
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)mysql_MYSQL(三)
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 依赖注入和配置系统
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET企业级应用架构设计系列之开场白
  • .NET企业级应用架构设计系列之应用服务器
  • /*在DataTable中更新、删除数据*/
  • @Autowired标签与 @Resource标签 的区别
  • @GetMapping和@RequestMapping的区别
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)