Example #1
0
  @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;
  }