布局文件不需要改

MainActivity.java

package com.example.ch08providerdemo;import androidx.appcompat.app.AppCompatActivity;import android.net.Uri;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册ContentObservergetContentResolver().registerContentObserver(Uri.parse("content://" + MyStar.AUTHORITY),true,new MyObserver(null));}
}

MyObserver.java

package com.example.ch08providerdemo;import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;public class MyObserver extends ContentObserver {public MyObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);
//        if(selfChange){Log.i("lww", "数据发生变化");
//        }}
}

MySqliteHelper.java

package com.example.ch08providerdemo;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;public class MySqliteHelper extends SQLiteOpenHelper {public MySqliteHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {//第一次使用时创建数据库表String table = "create table StarTB(id integer primary key autoincrement, name varchar(10), hobby varchar(50))";sqLiteDatabase.execSQL(table);}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
}

MyStar.java

package com.example.ch08providerdemo;import android.net.Uri;
import android.provider.BaseColumns;/*** 用于定义数据表的结构的Java Bean*/
public final class MyStar {//定义Authoritypublic static final String AUTHORITY = "net.onest.lww.provider";//定义内部表结构(列名)public static final class MyStarTable implements BaseColumns{//定义数据表的列名称public final static String _ID = "id";public final static String NAME = "name";public final static String HOBBY = "hobby";//定义2个Uripublic final static Uri STARS_CONTENT_URI =Uri.parse("content://" + AUTHORITY + "/stars");public final static Uri STAR_CONTENT_URI =Uri.parse("content://" + AUTHORITY + "/star/#");}
}

MyStarProvider.java

package com.example.ch08providerdemo;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;public class MyStarProvider extends ContentProvider {//定义UriMatcher属性private static UriMatcher matcher =new UriMatcher(UriMatcher.NO_MATCH);//定义数据库管理类的对象属性private MySqliteHelper dbHelper;//定义2个标号private static final int STARS = 1;private static final int STAR = 2;//注册2个Uri,并关联Uri与标号static{matcher.addURI(MyStar.AUTHORITY, "stars", STARS);matcher.addURI(MyStar.AUTHORITY, "star/#", STAR);}public MyStarProvider() {}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {int n = 0;//获取可写的数据库对象SQLiteDatabase db = dbHelper.getWritableDatabase();switch (matcher.match(uri)){case STARS:n = db.delete("StarTB", selection, selectionArgs);break;case STAR://获取资源idlong id = ContentUris.parseId(uri);Log.i("lww", "待删除的id:" + id);//重新拼接where条件String where = "id = " + id;if(null != selection && !"".equals(selection)) {where = where + " and " + selection;}//执行更新n = db.delete("StarTB", where, selectionArgs);break;default:throw new UnsupportedOperationException("Not yet implemented");}if(n > 0){//通知数据改变getContext().getContentResolver().notifyChange(uri, null);}return n;}@Overridepublic String getType(Uri uri) {String type = null;//根据参数的形式(批量/单一操作)来返回相应的MIME类型switch (matcher.match(uri)){case STARS://批量操作数据type = "lww.cursor.dir/net.onest.lww.provider";break;case STAR://单一操作数据type = "lww.cursor.item/net.onest.lww.provider";break;default:throw new UnsupportedOperationException("Not yet implemented");}return type;}@Overridepublic Uri insert(Uri uri, ContentValues values) {//实现插入数据操作switch (matcher.match(uri)){//            case STAR:case STARS://获取可写的数据库对象SQLiteDatabase db = dbHelper.getWritableDatabase();//执行插入操作long rowId = db.insert("StarTB", null, values);if(rowId > 0){//插入成功,通知数据改变//通知数据改变getContext().getContentResolver().notifyChange(uri, null);// 拼接Uri和被插入数据的idreturn ContentUris.withAppendedId(uri, rowId);}else{//插入失败return null;}default:throw new UnsupportedOperationException("Not yet implemented");}}@Overridepublic boolean onCreate() {dbHelper = new MySqliteHelper(getContext(),"StarsDB.db",null, 1);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor = null;//获取可读的数据库对象SQLiteDatabase db = dbHelper.getReadableDatabase();switch (matcher.match(uri)){case STARS://批量查询操作//执行查询操作cursor = db.query("StarTB", projection,selection, selectionArgs,null, null,sortOrder);break;case STAR://单一查询操作 。。。。。。。/../3//解析uri中的idlong id = ContentUris.parseId(uri);//重新拼接where条件String where = "id = " + id;if(null != selection && !"".equals(selection)) {where = where + " and " + selection;}//获取数据库执行查询操作cursor = db.query("StarDB", projection,where, selectionArgs, null,null, sortOrder);break;default:throw new UnsupportedOperationException("Not yet implemented");}return cursor;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int n = 0;//获取可写的数据库对象SQLiteDatabase db = dbHelper.getWritableDatabase();switch (matcher.match(uri)){case STARS:n = db.update("StarTB", values, selection, selectionArgs);break;case STAR://获取资源idlong id = ContentUris.parseId(uri);String where = "id = " + id;if(null != selection && !"".equals(selection)) {where = where + " and " + selection;}//执行更新n = db.update("StarTB", values, where, selectionArgs);break;default:throw new UnsupportedOperationException("Not yet implemented");}if(n > 0){//通知数据改变getContext().getContentResolver().notifyChange(uri, null);}return n;}
}

ch8 ProviderDemo相关推荐

  1. 视觉SLAM十四讲CH8代码解析及课后习题详解

    第一版的代码: direct_semidense.cpp #include <iostream> #include <fstream> #include <list> ...

  2. uvm_primer ch8 参数化类

    uvm_primer ch8 参数化类 ch8 parameterized class 从module位宽参数化引入 参数化类 举一反三:另一种实现方法 ch8 parameterized class ...

  3. 《视觉SLAM十四讲》笔记(ch8)

    ch8-视觉里程计2 主要目标:1.理解光流法跟踪特征点的原理 2.理解直接法是如何估计相机位姿的     3.使用g2o进行直接法的计算 本讲我们将介绍直接法的原理,并利用g2o实现直接法中的一些核 ...

  4. JavaWeb Adv CH8 web服务的相互转接(多图猫杀)

    具体的操作步骤: 一.建立service服务 操作如图所示: 输入service服务的项目的基本信息注意:frameword那里最好是选择比较好的XFire然后是Java EE5.0 注意下图中所选择 ...

  5. Core java for impatient 笔记 ch8 流

    流stream 使用了数据视图,让你可以在比集合更高的概念上指定操作 使用流,你只需要将操作的调度留给实现,例如,假设你要计算某个属性的平均值,你只需要 指定数据源和属性,然后流类库会优化计算,比如使 ...

  6. 计算机视觉ch8 基于LeNet的手写字体识别

    文章目录 原理 LeNet的简单介绍 Minist数据集的特点 Python代码实现 原理 卷积神经网络参考:https://www.cnblogs.com/chensheng-zhou/p/6380 ...

  7. TCP/IP网络编程笔记-ch8.域名及网络地址

    文章目录 函数 利用域名获取IP地址 利用IP地址获取域名 知识点 域名系统 IP地址和域名之间的转换 实例 函数 利用域名获取IP地址 利用gethostbyname可以通过传递字符串格式的域名获取 ...

  8. 机器学习实战——ch8.2 回归之预测乐高玩具价格

    这部分由于书上提供的Google的购物API已经关闭,所以只能在实验楼上完成了这个实验(这一次,我只是代码的搬运工) 完整的代码及注释: #-*- coding: utf-8 -*- from num ...

  9. scanf可不可以输入浮点型_数据的输入和输出

    一.基本数据类型C 的基本数据类型有 short.int.long.char.float.double 等.类型多且杂,学习时极易厌烦,这时建议使用思维导图来整理这些繁杂但有章的知识.做思维导图时首先 ...

  10. MM32F3277 MicroPython 实验板设计和软件测试

    简 介: 对于截止到(2021-11-08 21:13:44)来自灵动的MicroPython在MM32F3277上的一致的基本功能进行测试.并给除了MicroPython的相关模块的の基本测试调用版 ...

最新文章

  1. 目标还是中国人,纽约智慧城市项目想通过EB-5募资10亿
  2. nginx配置详解与优化
  3. java工程前面有个红色感叹号
  4. poj2104(划分树模板)
  5. 面向对象编程02—装饰器、类方法、静态方、访问控制
  6. 【数据结构与算法】之深入解析“三数之和”的求解思路与算法示例
  7. 盐城工学院计算机基础试卷,大学计算机基础及实用软件/大学计算机基础
  8. 【U3D】掉落物设计
  9. win10定时关机程序
  10. arduino i2c EEPROM(AT24C02、AT24C08、AT24C16、AT24C32、AT24C64)驱动
  11. 简要分析VB6.0和VB.NET区别
  12. 外贸ERP软件之工贸一体企业解决方案
  13. opengl 五角星画法 源代码
  14. java五子棋技术路线,一位老码农的编程简史
  15. VirtualBox安装Centos图解教程
  16. 【知乎】如何看待同学聚会上的言论「我在四线城市跟你在一线城市的年薪一样多(15万元)」?
  17. 《花千骨》绝美外景剧照 赵丽颖霍建华仙气足
  18. pytorch处理CK+数据集
  19. 数据分析,如何挖掘业务机会
  20. 2000的笔记本能HTML,我想买一个笔记本,最好是2000--3000元,请高人给个配置单。谢谢,家用的。...

热门文章

  1. (转)2017中国互联网证券年度报告
  2. (转)如何学习盈透api的开发?
  3. 连续 3 年支撑双 11,阿里云神龙如何扛住全球流量洪峰?
  4. Kafka从上手到实践 - 庖丁解牛:Consumer | 凌云时刻
  5. OpenStack Rocky Octavia 的实现与分析(零)架构简介
  6. 【优化分类】基于matlab麻雀算法优化核极限学习机KELM分类【含Matlab源码 1791期】
  7. 【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 1325期】
  8. 【滤波器】基于matlab平方根升余弦滤波器【含Matlab源码 994期】
  9. fb静态区域_西门子 PLC FC和FB用法讲解
  10. 【记录】帮同学做的一个函数拟合