四大组件之ContentProvider(三)-ContentProvider的数据存储

第4节 ContentProvider的数据存储

ContentProvider的数据存储经常使用SQL实现,当然也可以采用别的存储机制。

假设这个ContentProvider需要这样一个数据表:

id name price
0 book0 15
1 book1 13
2 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);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
        }
    
        @Override
        public 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 TABLE_NAME = "books_table";
    
    @Override
    public void onCreate(SQLiteDatabase db) {
    
        String BOOK_TABLE_CMD = "CREATE TABLE " +TABLE_NAME
                + "("
                + "id" + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + "name" +" VARCHAR(50),"
                + "price" + " VARCHAR(50)"
                + ");" ;
        db.execSQL(BOOK_TABLE_CMD);
    
    }
  4. 当数据表的结构发生变化时,需要进行应对原来数据表的升级。这里只是简单的删除以前存在的表格,再重新创建一个表格。在实际的商用软件中,要考虑到数据库表格的变化,把以前老数据表中的数据,逐一转存到新的数据表当中,
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);
        onCreate(db);
    }


/*******************************************************************/

* 版权声明

* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。

/*******************************************************************/


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;
}
时间: 2024-12-10 08:41:14

四大组件之ContentProvider(三)-ContentProvider的数据存储的相关文章

Android四大组件、六大布局和五大数据存储

Android的四大组件:activity(活动)1.一个activity通常是一个独立的屏幕.2.activity通过intent通讯.3.在Androidmanifest.xml声明即可识别执行.注意该文件还可以注册某些权限:如访问互联网.service(服务).1.定义:用于后台完成用户指定的操作(两种)a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态.b)bound(绑定):当应用程序组件调用bin

Android四大组件之内容提供者--ContentProvider

Android四大组件之内容提供者--ContentProvider 1,什么是ContentProvider ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法 ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略 ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据 ContentProvider中可以注册观察者, 监听数据的变化 2,怎么创建 2.1定义类继承ContentProvider,

MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理 MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案 先来了解下各项的引用关系 FytCms.DALMSSQL=>Domain.Entity.EntityFramework BusinessLogic.Server=>FytCms.D

Android四大组件应用系列——使用ContentProvider实现跨进程通讯

一.问题描述 如何在Android中实现不同应用之间的通讯(既跨进程进行调用)?Android提供了多种实现方式,使我们可以实现跨进程访问Activity.通过ContentProvider跨进程访问其他应用的数据.通过Broadcast可以向android系统中所有应用程序发送广播.使用AIDL实现跨进程的Service.下面我们就使用ContentProvider实现跨进程访问数据,并可对数据进行增.删.改.查 二.应用实现 使用ContentProvider实现数据共享,主要是共享应用的S

.NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化

         所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件:http://www.cnblogs.com/asxinyu/p/4329742.html 关于本文档的说明 本文档基于Infer.NET 2.6对Infer.NET User Guide进行中文翻译,但进行了若干简化和提炼,按照原网站的思路进行,但不局限与其顺序. 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈

Android学习之路——Android四大组件之activity(二)数据的传递

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据.另一种数据类型是parcelable和serialable 用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下. 一.利用bundle传递基本数据类型 1.启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(inten

Android开发学习笔记之四大组件---Activity的跳转,数据传递(二)

上一章我们温习了Activity的创建,以及各生命周期,这一章我们主要学习Activity的跳转,以及Activity之间的数据传递 一.Activity跳转: Activity之间的单纯跳转非常简单,只需要创建两个Activity,然后使用startActivity(intent)来进行跳转,看下代码: Intent uio=new Intent(thisActivityclass,ActivityBclass); startActivity(uio); Intent是什么? Android中

第三章 - 数据存储

3.1数据类型 分为数字,文本,音频,图像,视频 计算机内部的数据 位(bit,binary digit)时存储在计算机中的最小单位.他是0或1. 位模式 为了表示数据的不同类型,应该使用位模式,他是一个序列,有时也被称为位流.通常长度为8的位模式被称为1字节 3.2.1存储整数(定点表示法) 定点表示法用于存储整数,在这个表示法里,小数点是假定的,但并不存储. 但是,用户或程序可能将整数作为小数部分为0的实数存储,这是可能的,当整数太大以至于无法定义为整数来存储.为了更有效的利用计算机内存,无

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

第3节 自定义ContentProvider 自定义一个ContentProvider,需要 继承ContentProvider类重新创建一个类,并实现其中的一些方法: 在应用的AndroidManifest.xml文件中,声明这个新添加的组件: 但在这之前,我们要来设计一下外部访问它采用的地址. 3.1 地址设计 Uri的scheme字段是固定的,使用content:. authority定义成程序的包名com.anddle.mycontentprovider. path就像是网站内部的分类,

android 意图和四大组件

意图 Intent                                            一.显式意图        直接指定要实现的类:            Intent intent=new Intent(MainActivity.this,xxx.class);            this.startActivity(intent);            二.隐式意图        1:xml配置:在意图所指向的类的配置中添加属性<intent-filter>&l