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

更新时间修改意见
2016-08-02陈敏

第4节 ContentProvider的数据存储

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

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

_idnameprice
1book015
2book113
3book218

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 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编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值