SQLiteOpenHelper+ContentProvider的使用
效果图:
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的使用的更多相关文章
- ContentResolver + SqliteOpenHelper + ContentProvider 理解
惭愧,现在才接触到ContentResolver的用法 这个类主要是Android用来实现应用程序之间数据共享的 一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的 ...
- Android之ContentProvider数据存储
一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...
- Xamarin.Android之ContentProvider
一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...
- ContentProvider域名替换小工具
开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...
- 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider
一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...
- 安卓初級教程(3):ContentProvider的運用原理
package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...
- Android笔记——SQLiteOpenHelper类
public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...
- Android细笔记--ContentProvider
Provider的不常见访问方式 Batch access:访问ContentProvider的一中模式,使用该模式可以同时对provider进行多个操作,且支持同时操作多个表.使用时首先构建一个Co ...
- Android四大组件--ContentProvider详解(转)
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
随机推荐
- Scrapy-Redis分布式爬虫常规操作
一.X-path 的常规用法1./是从根节点选取,有顺序2.//从当前节点选择文档中的节点,无顺序3..选取当前节点4...选取当前节点的父节点5.@选取属性6. //div[@class='docl ...
- Java高并发--原子性可见性有序性
Java高并发--原子性可见性有序性 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 原子性:指一个操作不可中断,一个线程一旦开始,直到执行完成都不会被其他线程干扰.换 ...
- spring mvc 启动过程及源码分析
由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...
- 使用String. localeCompare比较字符串
javascript提供stringA.localeCompare(stringB)方法,来判断一个字符串stringB是否排在stringA的前面. 返回值: 如果引用字符存在于比较字符之前则 ...
- es6的let,const
1.es6 新增的let const 命令 let用来定义一个局部变量,故名思意就是只在当前代码块可用 1.1 let 声明的变量不存在变量提升(var 声明的变量存在变量提升)且代码块内 暂时性死区 ...
- SAP MM MI01事务代码里的批次确定
SAP MM MI01事务代码里的批次确定 1 – 批次管理启用之后果 一个物料如果启用了批次管理,那么库存管理以及盘点等诸多事务里都需要在批次的层次上进行. 货物移动的时候,需要在界面上指定相关货物 ...
- arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Lansat8大气校正USGS-EROS项目espa-surface-reflectance中的LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本的使用(三)
Landsat8大气校正程序LaSRC是目前最好的,使用方式也够傻瓜,输入文件输出结果. 但有一个限制,就是程序需要预先下载好的MODIS辅助文件来确定水汽.压强等大气参数. 如果待大气校正的land ...
- Android TV端的(RecyclerView)水平滚动焦点错乱问题
package com.hhzt.iptv.ui.customview; import android.content.Context;import android.content.res.Typed ...
- (最简单)红米手机5A的USB调试模式在哪里开启的方法
当我们使用安卓手机链接Pc的时候,或者使用的有些APP比如我们公司营销小组当使用的APP引号精灵,之前使用的老版本就需要开启usb调试模式下使用,现当新版本不需要了,如果手机没有开启usb调试模式,P ...