我的目标
我想批量插入多个记录到sqlite(事务性).
我的问题
我发现android.content.ContentResolver.bulkInsert(..)方法很有趣,但是javadoc说明:
This function make no guarantees about the atomicity of the insertions.
为什么android会提供一种瘫痪的方法?你能说出用于非原子插入的用例吗?我显然会覆盖ContentProvider.bulkInsert(..)以确保自己的原子性,所以我不确定为什么它是这样的短语.
解决方法
我们需要覆盖批量插入方法,如下所示……
public class Provider extends ContentProvider { public static final Uri URI = Uri.parse("content://com.example.android.hoge/"); @Override public String getType(Uri uri) { return null; } @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) { Helper helper = Helper.getInstance(getContext(),null); SQLiteDatabase sdb = helper.getReadableDatabase(); Cursor cursor = sdb.query( Table.TABLENAME,new String[]{Table.ID,Table.DATA,Table.CREATED},selection,selectionArgs,null,sortOrder,null ); return cursor; } @Override public Uri insert(Uri uri,ContentValues values) { Helper helper = Helper.getInstance(getContext(),null); SQLiteDatabase sdb = helper.getWritableDatabase(); sdb.insert(Table.TABLENAME,values); getContext().getContentResolver().notifyChange(uri,null); return uri; } /** * super.bulkInsert is implemented the loop of insert without transaction * So we need to override it and implement transaction. */ @Override public int bulkInsert(Uri uri,ContentValues[] values) { Helper helper = Helper.getInstance(getContext(),null); SQLiteDatabase sdb = helper.getWritableDatabase(); sdb.beginTransaction(); SQLiteStatement stmt = sdb.compileStatement( "INSERT INTO `" + Table.TABLENAME + "`(`" + Table.DATA + "`,`" + Table.CREATED + "`) VALUES (?,?);" ); int length = values.length; for(int i = 0; i < length; i++){ stmt.bindString(1,values[i].getAsString(Table.DATA)); stmt.bindLong(2,values[i].getAsLong(Table.CREATED)); stmt.executeInsert(); } sdb.setTransactionSuccessful(); sdb.endTransaction(); return length; } @Override public int update(Uri uri,ContentValues values,String[] selectionArgs) { Helper helper = Helper.getInstance(getContext(),null); SQLiteDatabase sdb = helper.getWritableDatabase(); int rows = sdb.update(Table.TABLENAME,values,selectionArgs); getContext().getContentResolver().notifyChange(uri,null); return rows; } @Override public int delete(Uri uri,null); SQLiteDatabase sdb = helper.getWritableDatabase(); int rows = sdb.delete(Table.TABLENAME,null); return rows; } private static class Helper extends SQLiteOpenHelper { static Helper INSTANCE = null; private Helper(Context context,CursorFactory factory) { super(context,Table.FILENAME,factory,Table.VERSION); } public static Helper getInstance(Context context,CursorFactory factory) { if (INSTANCE == null) { INSTANCE = new Helper(context,factory); } return INSTANCE; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL( "CREATE TABLE `" + Table.TABLENAME + "`(" + " `" + Table.ID + "` INTEGER PRIMARY KEY AUTOINCREMENT," + " `" + Table.CREATED + "` INTEGER," + " `" + Table.DATA + "` TEXT" + ");" ); } @Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。