Multiple rows insert with ContentProvider

后端 未结 4 1978
醉话见心
醉话见心 2021-02-02 00:23

I need to make insert of few rows in one transaction. Can I do it with ContentProvider?

4条回答
  •  旧时难觅i
    2021-02-02 00:37

    I also use replace mode for insert row - db.insertWithOnConflict(EVENT_TABLE_NAME, null, value, SQLiteDatabase.CONFLICT_REPLACE); Its will rid of conflict if record is exist already

    In DatabaseHelper add UNIQUE INDEX

        public class DataProvider extends ContentProvider {
    
        private static class DatabaseHelper extends SQLiteOpenHelper {
            DatabaseHelper(Context context){
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db){
                db.execSQL(CREATE_EVENT_TABLE);
                db.execSQL("CREATE UNIQUE INDEX event_idx ON " + EVENT_TABLE_NAME + " ( " + EventTable.EVENT_ID + " )");
    // ...
    
            ...
            @Override
            public int bulkInsert(Uri uri, ContentValues[] values) {
                Log.i(TAG, "bulkInsert");
                if (values.length == 0)
                    return 0;
                int insertCount = 0;
                try {
                    switch (uriMatcher.match(uri)) {
                        case EVENT_LIST:
                            try {
                                db.beginTransaction();
                                for (ContentValues value : values) {
                                    long id = db.insertWithOnConflict(EVENT_TABLE_NAME, null, value, SQLiteDatabase.CONFLICT_REPLACE);
                                    if (id > 0)
                                        insertCount++;
                                }
                                db.setTransactionSuccessful();
                            } catch (Exception e) {
                                // Your error handling
                            } finally {
                                db.endTransaction();
                            }
                            break;
                        default:
                            throw new IllegalArgumentException("Unknown URI " + uri);
                    }
                    getContext().getContentResolver().notifyChange(uri, null);
                } catch (Exception e) {
                    Log.i(TAG, "Exception : " + e);
                }
                return insertCount;
            }
    

    And call bulkInsert like this:

                ContentValues[] cvArr = new ContentValues[eventList.size()];
                long insertCount = 0;
                int i = 0;
                for (Event event : eventList) {
                    ContentValues cv = new ContentValues();
                    cv.put(DataProvider.EventTable.EVENT_ID, event.id);
                    cv.put(DataProvider.EventTable.SENSOR_ID, event.sensor_id);
                    cv.put(DataProvider.EventTable.TIMESTAMP, event.time);
                    cvArr[i++] = cv;
                }
                // returns ID
                insertCount = context.getContentResolver()
                        .bulkInsert(DataProvider.CONTENT_EVENT_LIST, cvArr);
    

提交回复
热议问题