更新时间 修改意见
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数据库。

  1. 继承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) {}
    }
  2. 在构造函数中,创建数据库,指定数据库的名字和版本号,

    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);
    }
  3. 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);}
  4. 当数据表的结构发生变化时,需要对原来数据表进行升级。这里只是简单的删除以前存在的表格,再重新创建一个表格。在实际的商用软件中,要考虑到数据库表格的变化,把以前老数据表中的数据,逐一转存到新的数据表当中。[注: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的增删改查函数,使用数据库实现对数据的操作。

  1. onCreate(),创建SQL帮助类,

    private DBHelper mDBHelper;@Override
    public boolean onCreate() {Log.d(TAG, " onCreate");mDBHelper = new DBHelper(getContext());return true;
    }
  2. 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;
    }
  3. 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;
    }
  4. 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;
    }
  5. 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命令,方便开发者灵活的操作数据。

  1. SQLiteOpenHelpergetReadableDatabase()获取读取数据库的能力;
  2. SQLiteOpenHelpergetWritableDatabase()获取写入数据库的能力。

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的数据存储相关推荐

  1. 三、大数据存储——HBase

    目录 一.NOSQL引入 1.1.NoSQL数据库简介 1.2.混合持久化 1.3.数据模型的转变 2.HBASE 2.1.Hbase是什么 2.2.Hbase实践 2.3.HBase列式存储模型 2 ...

  2. 区块链开发之Solidity编程基础(三)合约数据存储

    Solidity编程基础三 概要 以太坊虚拟机 EVM 数据位置 storage/存储 memory/内存 calldata/调用数据 Stack 栈 数据赋值成本 概要 本章将进行太坊虚拟机EVM的 ...

  3. 四大组件之Service(三)-Service的跨进程调用

    更新时间 修改意见 2016-08-02 陈敏 第4节 远程调用 之前提到过:如果站在Service与触发Service运行的那个组件的角度,根据它们的关系进行分类,有两种:本地Service,远程S ...

  4. Android 四大组件之——Acitivity(三) 深入了解Activity的启动流程

    上图为整个Activity的启动流程 接下来我们大概分析 在我们的Android系统中,应用程序是由Launcher这个应用启动起来的.当我们安装好应用程序之后,就会在Launcher的界面上生成一个 ...

  5. mongodb 存储过程 遍历表数据_三、redis数据存储之跳跃表(SKIP LIST)

    导读 前面文章[一.深入理解redis之需要掌握的知识点 ]中,我们对redis需要学习的内容框架进行了一个梳理.[二.redis中String和List两种数据类型和应用场景 ].[二.redis中 ...

  6. 三、redis数据存储之跳跃表(SKIP LIST)

    导读 前面文章[一.深入理解redis之需要掌握的知识点 ]中,我们对redis需要学习的内容框架进行了一个梳理.[二.redis中String和List两种数据类型和应用场景 ].[二.redis中 ...

  7. 四大组件之ContentProvider(二)-轻轻松松自定义ContentProvider

    更新时间 修改意见 2016-08-02 陈敏 第3节 自定义ContentProvider 自定义一个ContentProvider,需要 继承ContentProvider类重新创建一个类,并实现 ...

  8. 一个帖子学会Android开发四大组件

    注:本文来自"友盟杯",仅在此阅读,学习 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadcast Re ...

  9. Android 安卓 四大组件

    Android开发的四大组件  Android四大组件分别为activity.service.content provider.broadcast receive  一.Activity    Act ...

  10. Android开发基础(四大组件及Intent)

    一.Android开发的四大组件: 1.Activity:(通常展现一个可视化的用户界面) (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通 ...

最新文章

  1. 【新拟态】左上角标签样式、ICON图标样式、模仿AppStore的应用图标
  2. 目标检测的二十年发展史—从传统方法到深度学习
  3. UVa1377 Ruler(dfs或者bfs)
  4. Hadoop2.0 YARN
  5. 1.9 Java 9增强的自动资源管理
  6. 【深度学习的数学】2-11 用Excel体验梯度下降法(用python实现)
  7. ::的类名前有个 ,什么意思?
  8. 大数据互联网架构阶段 全文检索技术
  9. 判断字符串中是否包含中文
  10. 曾隐姓埋名28年,两弹一星元勋于敏逝世
  11. 北京 | 蚂蚁集团共享智能团队招聘研究实习生
  12. Python数据结构:顺序查找
  13. 云版 Android 系统来了?
  14. 自动化测试工具-Airtest
  15. python mysql扩展,python-sql-faker:轻量级、易拓展的数据库智能填充开源库(Python实现版)...
  16. S32K144(19)FlexIO
  17. Linux下Firefox和chrome浏览器flash插件的安装
  18. NVIDIA主控CPU/GPU设置频率
  19. R语言笔记7:functions——编写函数所需的基础知识
  20. @vue3 element-plus 按需引入,默认英文组件修改为中文

热门文章

  1. 亲测好用的屏幕截图软件:Snagit 2022 Mac汉化版
  2. 苏嵌实训——day9
  3. LibreOffice具体用法
  4. 德龙X5000导航升级包下载
  5. 番外7:F类功放中漏极四分之一波长阻抗线特性分析
  6. miui 8 android对应关系,MIUI2.3到MIUI8的演变过程,满满的回忆
  7. python抢购爬虫_python爬虫,抢小米抢购,
  8. 云计算设计模式(六)——命令和查询职责分离(CQRS)模式
  9. 球半足篮即时比分,NBA总冠军争霸赛,谁与我争勇?
  10. 表白网站源码-html源码