四大组件之ContentProvider(三)-ContentProvider的数据存储
更新时间 | 修改意见 |
---|---|
2016-08-02 | 陈敏 |
第4节 ContentProvider的数据存储
ContentProvider
的数据存储经常使用SQL实现,当然也可以采用别的存储机制。
假设这个ContentProvider
需要这样一个数据表:
_id | name | price |
---|---|---|
1 | book0 | 15 |
2 | book1 | 13 |
3 | book2 | 18 |
4.1 SQL实现数据存储
4.1.1 创建数据库
Android SDK提供了SQLiteOpenHelper
来方便开发者使用SQL数据库。
继承
SQLiteOpenHelper
,创建我们的帮助类,public class DBHelper extends SQLiteOpenHelper {public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} }
在构造函数中,创建数据库,指定数据库的名字和版本号,
private final static String DB_NAME = "my.db"; private final static int DB_VERSION = 1;public DBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION); }
在
onCreate()
函数中,根据前面的表格设计,创建SQL数据表,public final static String BOOK_TABLE_NAME = "books_table";@Override public void onCreate(SQLiteDatabase db) {String BOOK_TABLE_CMD = "CREATE TABLE " + BOOK_TABLE_NAME+ "("+ "id" + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ "name" +" VARCHAR(50),"+ "price" + " VARCHAR(50)"+ ");" ;db.execSQL(BOOK_TABLE_CMD);}
当数据表的结构发生变化时,需要对原来数据表进行升级。这里只是简单的删除以前存在的表格,再重新创建一个表格。在实际的商用软件中,要考虑到数据库表格的变化,把以前老数据表中的数据,逐一转存到新的数据表当中。[注:sqlite不支持简单的drop column]
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);onCreate(db); }
4.1.2 为ContentProvider添加SQL支持
修改MyContentProvider
的增删改查函数,使用数据库实现对数据的操作。
onCreate()
,创建SQL帮助类,private DBHelper mDBHelper;@Override public boolean onCreate() {Log.d(TAG, " onCreate");mDBHelper = new DBHelper(getContext());return true; }
insert()
,插入数据,@Override public Uri insert(Uri uri, ContentValues values) {Uri result = null; switch (sUriMatcher.match(uri)) {case BOOKS: {SQLiteDatabase db = mDBHelper.getWritableDatabase();long id = db.insert(DBHelper.TABLE_NAME, null, values);if(id > 0) {result = ContentUris.withAppendedId(CONTENT_BOOKS_URI, id);}}break;......default:throw new IllegalArgumentException("Unknown URI " + uri);}return result; }
delete()
,删除数据,@Override public int delete(Uri uri, String selection, String[] selectionArgs) {int result = 0;switch (sUriMatcher.match(uri)) {case BOOKS: {SQLiteDatabase db = mDBHelper.getWritableDatabase();int count = db.delete(DBHelper.TABLE_NAME, selection, selectionArgs);result = count;}break;......default:throw new IllegalArgumentException("Unknown URI " + uri);}return result; }
update()
,更新数据,@Override public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int result = 0;switch (sUriMatcher.match(uri)) {case BOOKS: {SQLiteDatabase db = mDBHelper.getWritableDatabase();int count = db.update(DBHelper.TABLE_NAME, values, selection, selectionArgs);result = count;}break;......default:throw new IllegalArgumentException("Unknown URI " + uri);}return result; }
query()
,查询数据,@Override public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor result = null;switch (sUriMatcher.match(uri)) {case BOOKS: {SQLiteDatabase db = mDBHelper.getReadableDatabase();Cursor cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);result = cursor;}break;......default:throw new IllegalArgumentException("Unknown URI " + uri);}return result; }
SQLiteOpenHelper
可以直接使用ContentProvider
传入的SQL命令,方便开发者灵活的操作数据。
SQLiteOpenHelper
的getReadableDatabase()
获取读取数据库的能力;SQLiteOpenHelper
的getWritableDatabase()
获取写入数据库的能力。
4.2 其他方式的数据存储
除了SQL,还可以使用别的方式存储数据,例如文本文件,甚至链表。
对于不使用SQL的实现方式,query()
函数要返回Cursor
对象,那么可以使用MatrixCursor
,例如,
@Override
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor result = null;switch (sUriMatcher.match(uri)) {case BOOKS: {String[] tableCursor = new String[] { "id", "name", "price" };MatrixCursor cursor = new MatrixCursor(tableCursor);cursor.addRow(new Object[] { "8", "book8", "23" });result = cursor;}break;......default:throw new IllegalArgumentException("Unknown URI " + uri);}return result;
}
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。
*最后再次感谢各位读者对安豆
的支持,谢谢:)
/*******************************************************************/
四大组件之ContentProvider(三)-ContentProvider的数据存储相关推荐
- 三、大数据存储——HBase
目录 一.NOSQL引入 1.1.NoSQL数据库简介 1.2.混合持久化 1.3.数据模型的转变 2.HBASE 2.1.Hbase是什么 2.2.Hbase实践 2.3.HBase列式存储模型 2 ...
- 区块链开发之Solidity编程基础(三)合约数据存储
Solidity编程基础三 概要 以太坊虚拟机 EVM 数据位置 storage/存储 memory/内存 calldata/调用数据 Stack 栈 数据赋值成本 概要 本章将进行太坊虚拟机EVM的 ...
- 四大组件之Service(三)-Service的跨进程调用
更新时间 修改意见 2016-08-02 陈敏 第4节 远程调用 之前提到过:如果站在Service与触发Service运行的那个组件的角度,根据它们的关系进行分类,有两种:本地Service,远程S ...
- Android 四大组件之——Acitivity(三) 深入了解Activity的启动流程
上图为整个Activity的启动流程 接下来我们大概分析 在我们的Android系统中,应用程序是由Launcher这个应用启动起来的.当我们安装好应用程序之后,就会在Launcher的界面上生成一个 ...
- mongodb 存储过程 遍历表数据_三、redis数据存储之跳跃表(SKIP LIST)
导读 前面文章[一.深入理解redis之需要掌握的知识点 ]中,我们对redis需要学习的内容框架进行了一个梳理.[二.redis中String和List两种数据类型和应用场景 ].[二.redis中 ...
- 三、redis数据存储之跳跃表(SKIP LIST)
导读 前面文章[一.深入理解redis之需要掌握的知识点 ]中,我们对redis需要学习的内容框架进行了一个梳理.[二.redis中String和List两种数据类型和应用场景 ].[二.redis中 ...
- 四大组件之ContentProvider(二)-轻轻松松自定义ContentProvider
更新时间 修改意见 2016-08-02 陈敏 第3节 自定义ContentProvider 自定义一个ContentProvider,需要 继承ContentProvider类重新创建一个类,并实现 ...
- 一个帖子学会Android开发四大组件
注:本文来自"友盟杯",仅在此阅读,学习 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadcast Re ...
- Android 安卓 四大组件
Android开发的四大组件 Android四大组件分别为activity.service.content provider.broadcast receive 一.Activity Act ...
- Android开发基础(四大组件及Intent)
一.Android开发的四大组件: 1.Activity:(通常展现一个可视化的用户界面) (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通 ...
最新文章
- 【新拟态】左上角标签样式、ICON图标样式、模仿AppStore的应用图标
- 目标检测的二十年发展史—从传统方法到深度学习
- UVa1377 Ruler(dfs或者bfs)
- Hadoop2.0 YARN
- 1.9 Java 9增强的自动资源管理
- 【深度学习的数学】2-11 用Excel体验梯度下降法(用python实现)
- ::的类名前有个 ,什么意思?
- 大数据互联网架构阶段 全文检索技术
- 判断字符串中是否包含中文
- 曾隐姓埋名28年,两弹一星元勋于敏逝世
- 北京 | 蚂蚁集团共享智能团队招聘研究实习生
- Python数据结构:顺序查找
- 云版 Android 系统来了?
- 自动化测试工具-Airtest
- python mysql扩展,python-sql-faker:轻量级、易拓展的数据库智能填充开源库(Python实现版)...
- S32K144(19)FlexIO
- Linux下Firefox和chrome浏览器flash插件的安装
- NVIDIA主控CPU/GPU设置频率
- R语言笔记7:functions——编写函数所需的基础知识
- @vue3 element-plus 按需引入,默认英文组件修改为中文