您的位置:首页 > 数据库 > SQL

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

2014-05-16 15:43 501 查看
1.SQLiteOpenHelper是将对数据库和表的创建、插入、更新、删除操作进行了简单的封装;

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

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

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

[java] view
plaincopy

mDatabase.beginTransaction();

try{

//在这里执行多个数据库操作

//执行过程中可能会抛出异常

mDatabase.setTransactionSuccessful();

//在setTransactionSuccessful和endTransaction之间不进行任何数据库操作

}catch(Exception e){

//当数据库操作出现错误时,需要捕获异常,结束事务

mDatabase.endTransaction();

throw e;

}

//当所有操作执行完成后结束一个事务

mDatabase.endTransaction();

}

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

[java] view
plaincopy

@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;

}

[java] view
plaincopy

@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的代码比其它方式都简洁明了;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐