`
nanjingjiangbiao_T
  • 浏览: 2585310 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

ContentProvider,SQLiteOpenHelper,SQLiteDatabase三者之间的区别和联系

 
阅读更多

1.SQLiteOpenHelper是将对数据库和表的创建、插入、更新、删除操作进行了简单的封装;

2.而ContentProvider可以说是一个对外的接口,除了可以实现对SQLiteOpenHelper的封装,还可以实现对文件操作、图片操作、对象操作等实现封装;

3.在多线程中使用SQLiteOpenHelper要考虑线程同步问题,而如果使用ContentProvider的话基本不用考虑;

4.另外在对事务的支持时SQLiteDatabase和ContentProvider的写法有所不同:

mDatabase.beginTransaction();
try{
  //在这里执行多个数据库操作
  //执行过程中可能会抛出异常
  mDatabase.setTransactionSuccessful();
  //在setTransactionSuccessful和endTransaction之间不进行任何数据库操作
  }catch(Exception e){
    //当数据库操作出现错误时,需要捕获异常,结束事务
    mDatabase.endTransaction();
    throw e;
  }
  //当所有操作执行完成后结束一个事务
  mDatabase.endTransaction();
}

而后者是通过重写ContentProvider的applyBatch或者bulkInsert方法来实现:

@Override
    public int bulkInsert(Uri uri, ContentValues[] values) {
        int numValues = values.length;
        mDb = mOpenHelper.getWritableDatabase();
        mDb.beginTransaction();
        try {
            for (int i = 0; i < numValues; i++) {
                Uri result = insertInTransaction(uri, values[i]);
            }
            mDb.setTransactionSuccessful();
        } finally {
            mDb.endTransaction();
        }

        return numValues;
    }

@Override
    public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
            throws OperationApplicationException {
        mDb = mOpenHelper.getWritableDatabase();
        mDb.beginTransaction();
        try {
            final int numOperations = operations.size();
            final ContentProviderResult[] results = new ContentProviderResult[numOperations];
            for (int i = 0; i < numOperations; i++) {
                final ContentProviderOperation operation = operations.get(i);
                results[i] = operation.apply(this, results, i);
            }
            mDb.setTransactionSuccessful();
            return results;
        } finally {
            mDb.endTransaction();
         }
    }

(注意上面的代码在放到项目中时可能还需要额外补充,这里只是代码片段思路)

5.另外在使用AsynQueryHandler的时候,使用ContentProvider也更为方便;

6.使用ContentProvider的代码比其它方式都简洁明了;

分享到:
评论

相关推荐

    ContentProvider

    private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority=...

    ContentProviderDemo.zip

    Android 四大件组件之一ContentProvider demo案例,下载...存储数据使用系统自带的数据库SQLIteOpenHelper,自定义ContentProvider,通过ContentResolver访问ContentProvider,实现数据新增、查找、删除、修改等功能。

    sqlite&provider&observer

    SQLiteDatabase,SQLiteOpenHelper,ContentProvider,ContentResolver,ContentObserver,ContentObserverable的使用简单使用。

    疯狂Android讲义源码

     4.1.4 使用Bundle在Activity之间  交换数据 181  4.1.5 启动其他Activity并返回结果 185  4.2 Activity的回调机制 189  4.3 Activity的生命周期 190  4.3.1 Activity的生命周期演示 190  4.3.2 Activity与...

    疯狂Android讲义.part2

    8.3.1 简介SQLiteDatabase 321 8.3.2 创建数据库和表 323 8.3.3 使用SQL语句操作SQLite 数据库 323 8.3.4 使用sqlite3工具 325 8.3.5 使用特定方法操作SQLite 数据库 327 8.3.6 事务 329 8.3.7 SQLiteOpenHelper类 ...

    疯狂Android讲义.part1

    8.3.1 简介SQLiteDatabase 321 8.3.2 创建数据库和表 323 8.3.3 使用SQL语句操作SQLite 数据库 323 8.3.4 使用sqlite3工具 325 8.3.5 使用特定方法操作SQLite 数据库 327 8.3.6 事务 329 8.3.7 SQLiteOpenHelper类 ...

    Android实例代码

    9.2、操作系统的ContentProvider:使用ContentProvider管理联系人和多媒体; 9.3、实现ContentProvider:创建ContentProvider的步骤; 9.4、监听ContentProvider的数据:ContentObserver; 第10章、Service与...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    9.2、操作系统的ContentProvider:使用ContentProvider管理联系人和多媒体; 9.3、实现ContentProvider:创建ContentProvider的步骤; 9.4、监听ContentProvider的数据:ContentObserver; 第10章、Service与...

Global site tag (gtag.js) - Google Analytics