@SuppressLint("SwitchIntDef") @SuppressWarnings("unchecked") public RunReturn run() { if (mQueryType != DELETE && (mValues == null || mValues.length == 0)) throw new IllegalStateException("No values were provided for this query to run."); else if (mInquiry.mContext == null) { try { return (RunReturn) (Integer) 0; } catch (Throwable t) { return (RunReturn) (Long) 0L; } } final ContentResolver cr = mInquiry.mContext.getContentResolver(); final List<Field> clsFields = ClassRowConverter.getAllFields(mRowClass); if (mTableName == null) throw new IllegalStateException("The table name cannot be null."); Field rowIdField = mInquiry.getIdField(mRowClass); try { switch (mQueryType) { case INSERT: Long[] insertedIds = new Long[mValues.length]; if (mInquiry.getDatabase() != null) { for (int i = 0; i < mValues.length; i++) { final RowType row = mValues[i]; if (row == null) continue; insertedIds[i] = mInquiry .getDatabase() .insert( mTableName, ClassRowConverter.clsToVals(this, row, null, clsFields, false)); ClassRowConverter.setIdField(row, rowIdField, insertedIds[i]); } } else if (mContentUri != null) { for (int i = 0; i < mValues.length; i++) { final RowType row = mValues[i]; if (row == null) continue; final Uri uri = cr.insert( mContentUri, ClassRowConverter.clsToVals(this, row, null, clsFields, false)); if (uri == null) return (RunReturn) (Long) (-1L); insertedIds[i] = Long.parseLong(uri.getLastPathSegment()); ClassRowConverter.setIdField(row, rowIdField, insertedIds[i]); } } else throw new IllegalStateException("Database helper was null."); postRun(false); return (RunReturn) insertedIds; case UPDATE: { boolean allHaveIds = rowIdField != null; if (rowIdField != null && mValues != null) { for (RowType mValue : mValues) { if (mValue == null) continue; long id = ClassRowConverter.getRowId(mValue, rowIdField); if (id <= 0) { allHaveIds = false; break; } } } if (allHaveIds) { // We want to update each object as themselves if (getWhere() != null && !getWhere().trim().isEmpty()) { throw new IllegalStateException( "You want to update rows which have IDs, but specified a where statement."); } int updatedCount = 0; for (RowType row : mValues) { if (row == null) continue; long rowId = ClassRowConverter.getRowId(row, rowIdField); ContentValues values = ClassRowConverter.clsToVals(this, row, mProjection, clsFields, true); if (mInquiry.getDatabase() != null) { updatedCount += mInquiry .getDatabase() .update(mTableName, values, "_id = ?", new String[] {rowId + ""}); } else if (mContentUri != null) { updatedCount += cr.update(mContentUri, values, "_id = ?", new String[] {rowId + ""}); } else throw new IllegalStateException("Database helper was null."); } postRun(true); return (RunReturn) (Integer) updatedCount; } RowType firstNotNull = mValues[mValues.length - 1]; if (firstNotNull == null) { for (int i = mValues.length - 2; i >= 0; i--) { firstNotNull = mValues[i]; if (firstNotNull != null) break; } } if (firstNotNull == null) throw new IllegalStateException("No non-null values specified to update."); ContentValues values = ClassRowConverter.clsToVals(this, firstNotNull, mProjection, clsFields, true); if (mInquiry.getDatabase() != null) { RunReturn value = (RunReturn) (Integer) mInquiry .getDatabase() .update(mTableName, values, getWhere(), getWhereArgs()); postRun(true); return value; } else if (mContentUri != null) return (RunReturn) (Integer) cr.update(mContentUri, values, getWhere(), getWhereArgs()); else throw new IllegalStateException("Database helper was null."); } case DELETE: { Long[] idsToDelete = null; if (rowIdField != null && mValues != null) { int nonNullFound = 0; idsToDelete = new Long[mValues.length]; for (int i = 0; i < mValues.length; i++) { if (mValues[i] == null) continue; nonNullFound++; long id = ClassRowConverter.getRowId(mValues[i], rowIdField); idsToDelete[i] = id; if (id <= 0) { idsToDelete = null; break; } } if (nonNullFound == 0) idsToDelete = null; } if (idsToDelete != null) { // We want to update each object as themselves if (getWhere() != null && !getWhere().trim().isEmpty()) { throw new IllegalStateException( "You want to delete rows which have IDs, but specified a where statement."); } //noinspection CheckResult,ConfusingArgumentToVarargsMethod whereIn("_id", idsToDelete); } if (mInquiry.getDatabase() != null) { RunReturn value = (RunReturn) (Integer) mInquiry.getDatabase().delete(mTableName, getWhere(), getWhereArgs()); traverseDelete(); return value; } else if (mContentUri != null) return (RunReturn) (Integer) cr.delete(mContentUri, getWhere(), getWhereArgs()); else throw new IllegalStateException("Database helper was null."); } } } catch (Throwable t) { Utils.wrapInReIfNeccessary(t); } return null; }