android – ContentResolver.bulkInsert(..)有什么意义?

前端之家收集整理的这篇文章主要介绍了android – ContentResolver.bulkInsert(..)有什么意义?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的目标

我想批量插入多个记录到sqlite(事务性).

我的问题

我发现android.content.ContentResolver.bulkInsert(..)方法很有趣,但是javadoc说明:

This function make no guarantees about the atomicity of the insertions.

为什么android会提供一种瘫痪的方法?你能说出用于非原子插入的用例吗?我显然会覆盖ContentProvider.bulkInsert(..)以确保自己的原子性,所以我不确定为什么它是这样的短语.

解决方法

我们需要覆盖批量插入方法,如下所示……
  1. public class Provider extends ContentProvider {
  2. public static final Uri URI = Uri.parse("content://com.example.android.hoge/");
  3. @Override
  4. public String getType(Uri uri) {
  5. return null;
  6. }
  7. @Override
  8. public boolean onCreate() {
  9. return false;
  10. }
  11. @Override
  12. public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) {
  13. Helper helper = Helper.getInstance(getContext(),null);
  14. sqliteDatabase sdb = helper.getReadableDatabase();
  15. Cursor cursor = sdb.query(
  16. Table.TABLENAME,new String[]{Table.ID,Table.DATA,Table.CREATED},selection,selectionArgs,null,sortOrder,null
  17. );
  18. return cursor;
  19. }
  20. @Override
  21. public Uri insert(Uri uri,ContentValues values) {
  22. Helper helper = Helper.getInstance(getContext(),null);
  23. sqliteDatabase sdb = helper.getWritableDatabase();
  24. sdb.insert(Table.TABLENAME,values);
  25. getContext().getContentResolver().notifyChange(uri,null);
  26. return uri;
  27. }
  28.  
  29. /**
  30. * super.bulkInsert is implemented the loop of insert without transaction
  31. * So we need to override it and implement transaction.
  32. */
  33. @Override
  34. public int bulkInsert(Uri uri,ContentValues[] values) {
  35. Helper helper = Helper.getInstance(getContext(),null);
  36. sqliteDatabase sdb = helper.getWritableDatabase();
  37.  
  38. sdb.beginTransaction();
  39. sqliteStatement stmt = sdb.compileStatement(
  40. "INSERT INTO `" + Table.TABLENAME + "`(`" + Table.DATA + "`,`" + Table.CREATED + "`) VALUES (?,?);"
  41. );
  42. int length = values.length;
  43. for(int i = 0; i < length; i++){
  44. stmt.bindString(1,values[i].getAsString(Table.DATA));
  45. stmt.bindLong(2,values[i].getAsLong(Table.CREATED));
  46. stmt.executeInsert();
  47. }
  48. sdb.setTransactionSuccessful();
  49. sdb.endTransaction();
  50. return length;
  51. }
  52.  
  53. @Override
  54. public int update(Uri uri,ContentValues values,String[] selectionArgs) {
  55. Helper helper = Helper.getInstance(getContext(),null);
  56. sqliteDatabase sdb = helper.getWritableDatabase();
  57. int rows = sdb.update(Table.TABLENAME,values,selectionArgs);
  58. getContext().getContentResolver().notifyChange(uri,null);
  59. return rows;
  60. }
  61.  
  62. @Override
  63. public int delete(Uri uri,null);
  64. sqliteDatabase sdb = helper.getWritableDatabase();
  65. int rows = sdb.delete(Table.TABLENAME,null);
  66. return rows;
  67. }
  68.  
  69. private static class Helper extends sqliteOpenHelper {
  70. static Helper INSTANCE = null;
  71. private Helper(Context context,CursorFactory factory) {
  72. super(context,Table.FILENAME,factory,Table.VERSION);
  73. }
  74. public static Helper getInstance(Context context,CursorFactory factory) {
  75. if (INSTANCE == null) {
  76. INSTANCE = new Helper(context,factory);
  77. }
  78. return INSTANCE;
  79. }
  80. @Override
  81. public void onCreate(sqliteDatabase db) {
  82. db.execsql(
  83. "CREATE TABLE `" + Table.TABLENAME + "`(" +
  84. " `" + Table.ID + "` INTEGER PRIMARY KEY AUTOINCREMENT," +
  85. " `" + Table.CREATED + "` INTEGER," +
  86. " `" + Table.DATA + "` TEXT" +
  87. ");"
  88. );
  89. }
  90. @Override
  91. public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
  92. }
  93. }
  94. }

猜你在找的Android相关文章