效果图:

PetDbHelper

package com.example.admin.pets;

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import com.example.admin.pets.PetContract.PetEntry;

public class PetDbHelper extends SQLiteOpenHelper {

    private static  final  String DATABASE_NAME="shelter.db";    private static  final  int DATABASE_VERSION=1;

    public PetDbHelper(Context context){        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }

    @Override    public void onCreate(SQLiteDatabase db) {        String SQL_CREATE_PETS_TABLE="CREATE TABLE "+PetEntry.TABLE_NAME+"("+ PetEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "                + PetEntry.COLUMN__PET_NAME + " TEXT NOT NULL, "                + PetEntry.COLUMN__PET_BREED + " TEXT, "                + PetEntry.COLUMN__PET_GENDER + " INTEGER NOT NULL, "                + PetEntry.COLUMN__PET_WEIGHT + " INTEGER NOT NULL DEFAULT 0);";        db.execSQL(SQL_CREATE_PETS_TABLE);

}

    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }}

PetProvider
package com.example.admin.pets;

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.util.Log;import com.example.admin.pets.PetContract.PetEntry;

public class PetProvider extends ContentProvider {

    public static final String LOG_TAG = PetProvider.class.getSimpleName();    private PetDbHelper petDbHelper;    private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);    private static final int PETS = 100;    private static final int PETS_ID = 101;

    static {        matcher.addURI(PetContract.CONTENT_AUTHORITY, PetContract.PATH_PETS, PETS);        matcher.addURI(PetContract.CONTENT_AUTHORITY, PetContract.PATH_PETS + "/#", PETS_ID); }

    @Override    public boolean onCreate() {        petDbHelper=new PetDbHelper(getContext());        return true;    }

    @Override    public Cursor query( Uri uri,  String[] projection, String selection,  String[] selectionArgs,String sortOrder) {        SQLiteDatabase sqLiteDatabase=petDbHelper.getReadableDatabase();        Cursor cursor;       final int match=matcher.match(uri);        switch (match){            case PETS:                cursor = sqLiteDatabase.query(PetContract.PetEntry.TABLE_NAME, projection, selection, selectionArgs, null, null,                        sortOrder);                break;            case PETS_ID:                selection = PetContract.PetEntry._ID + "=?";                selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))};                cursor = sqLiteDatabase.query(PetContract.PetEntry.TABLE_NAME, projection, selection, selectionArgs, null, null,                        sortOrder);                break;            default:                throw new IllegalArgumentException("Cannot query unknown URL" + uri);

        }        cursor.setNotificationUri(getContext().getContentResolver(),uri);        return cursor;    }

    @Override    public Uri insert( Uri uri,  ContentValues values) {        final int match = matcher.match(uri);        switch (match) {            case PETS:                return insertPet(uri, values);            default:                throw new IllegalArgumentException("Insertion is not supported for " + uri);        }    }

    private Uri insertPet(Uri uri, ContentValues values) {        String name = values.getAsString(PetEntry.COLUMN__PET_NAME);

        if (name == null) {            throw new IllegalArgumentException("Pet requires a name"); }

        Integer gender = values.getAsInteger(PetEntry.COLUMN__PET_GENDER);        if (gender == null || !PetEntry.isValidGender(gender)) {            throw new IllegalArgumentException("Pet requires valid gender"); }

        Integer weight = values.getAsInteger(PetEntry.COLUMN__PET_WEIGHT);        if (weight != null && weight < 0) {            throw new IllegalArgumentException("Pet requires valid weight"); }

        SQLiteDatabase database = petDbHelper.getWritableDatabase();

        long id = database.insert(PetEntry.TABLE_NAME, null, values);        if (id == -1) {            Log.e(LOG_TAG, "Failed to insert row for " + uri);            return null;        }

        getContext().getContentResolver().notifyChange(uri,null);        return ContentUris.withAppendedId(uri, id);    }

    @Override    public int delete( Uri uri,  String selection,String[] selectionArgs) {        int rowsDeleted;

        SQLiteDatabase database = petDbHelper.getWritableDatabase();

        final int match = matcher.match(uri);        switch (match) {            case PETS:                rowsDeleted = database.delete(PetEntry.TABLE_NAME, selection, selectionArgs);                break;            case PETS_ID:                selection = PetEntry._ID + "=?";                selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))};                rowsDeleted = database.delete(PetEntry.TABLE_NAME, selection, selectionArgs);                break;            default:                throw new IllegalArgumentException("Deletion is not supported for " + uri);        }

        if (rowsDeleted != 0) {            getContext().getContentResolver().notifyChange(uri, null);        }        return rowsDeleted;

    }

    @Override    public int update( Uri uri,  ContentValues values,  String selection,  String[] selectionArgs) {        final int match = matcher.match(uri);        switch (match) {            case PETS:                return updatePet(uri, values, selection, selectionArgs);            case PETS_ID:                selection = PetEntry._ID + "=?";                selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))};                return updatePet(uri, values, selection, selectionArgs);            default:                throw new IllegalArgumentException("Update is not supported for " + uri);        }    }

    private int updatePet(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

        if (values.containsKey(PetEntry.COLUMN__PET_NAME)) {            String name = values.getAsString(PetEntry.COLUMN__PET_NAME);            if (name == null) {                throw new IllegalArgumentException("Pet requires a name"); } }

        if (values.containsKey(PetEntry.COLUMN__PET_GENDER)) {            Integer gender = values.getAsInteger(PetEntry.COLUMN__PET_GENDER);            if (gender == null || !PetEntry.isValidGender(gender)) {                throw new IllegalArgumentException("Pet requires valid gender"); } }

        if (values.containsKey(PetEntry.COLUMN__PET_WEIGHT)) {            Integer weight = values.getAsInteger(PetEntry.COLUMN__PET_WEIGHT);            if (weight != null && weight < 0) {                throw new IllegalArgumentException("Pet requires valid weight"); } }

        if (values.size() == 0) {            return 0; }

        SQLiteDatabase database = petDbHelper.getWritableDatabase();        int rowsUpdated = database.update(PetEntry.TABLE_NAME, values, selection, selectionArgs);

        if (rowsUpdated != 0) {            getContext().getContentResolver().notifyChange(uri, null); }

        return rowsUpdated;    }

    @Override    public String getType( Uri uri) {        final int match = matcher.match(uri);        switch (match) {            case PETS:                return PetEntry.CONTENT_LIST_TYPE;            case PETS_ID:                return PetEntry.CONTENT_ITEM_TYPE;            default:                throw new IllegalStateException("Unknown URI " + uri + " with match " + match);        }

    }

}
github项目源码: https://github.com/NeoWu55/Android-Pets

SQLiteOpenHelper+ContentProvider的使用的更多相关文章

  1. ContentResolver + SqliteOpenHelper + ContentProvider 理解

    惭愧,现在才接触到ContentResolver的用法 这个类主要是Android用来实现应用程序之间数据共享的 一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的 ...

  2. Android之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...

  3. Xamarin.Android之ContentProvider

    一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...

  4. ContentProvider域名替换小工具

    开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...

  5. 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider

    一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...

  6. 安卓初級教程(3):ContentProvider的運用原理

    package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...

  7. Android笔记——SQLiteOpenHelper类

    public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...

  8. Android细笔记--ContentProvider

    Provider的不常见访问方式 Batch access:访问ContentProvider的一中模式,使用该模式可以同时对provider进行多个操作,且支持同时操作多个表.使用时首先构建一个Co ...

  9. Android四大组件--ContentProvider详解(转)

    一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...

随机推荐

  1. [leetcode](4.21)4. 有效子数组的数目

    给定一个整数数组 A,返回满足下面条件的 非空.连续 子数组的数目: 子数组中,最左侧的元素不大于其他元素. 示例 1: 输入:[1,4,2,5,3] 输出:11 解释:有 11 个有效子数组,分别是 ...

  2. vs2013中集成Git

    一:为什么不用2013中自带的? 我的2013自带的没法用,连最基本的克隆都用不了,网上看着下  好像说都不能用:不知道各位的如何. 二:如何自己讲Git集成到vs2013中? 需要的工具:     ...

  3. 前端js 实现文件下载

    https://www.zhangxinxu.com/wordpress/2017/07/js-text-string-download-as-html-json-file/ 侵删 1.H5 down ...

  4. vue项目利用apicloud打包成apk过程

    最近公司要求我们用apicloud做一个app,正好利用这个机会学习下app的制作过程~ 页面的开发过程跟我们平时开发一样,利用vue把页面全部完成,最后进行npm run build将项目打包. 接 ...

  5. 惊喜,重磅福利!免费开源ERP-企业信息化金矿

    Odoo,以前叫OpenERP,是比利时Odoo S.A.公司开发的一个企业应用软件套件,开源套件包括一个企业应用快速开发平台,以及几千个Odoo及第三方开发的企业应用模块.Odoo适用于各种规模的企 ...

  6. Android 运行报错 Unknown failure (at android.os.Binder.execTransact(Binder.java:681)) Error while Installing APKs 解决办法

    今天,我用手机测试的时候出现了这个错误 我网站查找了一会资料, 在运行的时候出现提示大致意思:卸载删除已存在应用程序,是否卸载现有应用程序,点击ok就会出现如下错误 原应用程序也没有卸载,然后自己手动 ...

  7. Django Windows环境下部署

    环境准备 本文将介绍如何在Windows系统上部署Django web项目,本次部署基于下面的架构: Windows10 64位+Python3.6+Django1.11+Apache2.4+mod_ ...

  8. C# 进程间通讯

    扩展阅读:http://www.cnblogs.com/joye-shen/archive/2012/06/16/2551864.html 一.进程间通讯的方式 1)共享内存 包括:内存映射文件,共享 ...

  9. Windows应急响应常识

    Windows 应急响应 常见事件ID 1102 清理审计日志 4624 账号登陆成功 4625 账号登陆失败 4672 授予特殊权限 4720 创建用户 4726 删除用户 4728 将成员添加到启 ...

  10. SQLServer的三种Recovery Model

    SQL Server恢复模式的三种类型的比较 此文章主要向大家讲述的是SQL Server恢复模式,我们主要介绍的是三种恢复模式,其中包括简单SQL Server数据库的恢复模式.完整恢复模式与大容量 ...