code: @NonNull
      @Override
      public PutResult performPut(@NonNull StorIOSQLite storIOSQLite, @NonNull T object) {
          final UpdateQuery updateQuery = mapToUpdateQuery(object);
          final StorIOSQLite.LowLevel lowLevel = storIOSQLite.lowLevel();
  
          // for data consistency in concurrent environment, encapsulate Put Operation into transaction
          lowLevel.beginTransaction();
  
          try {
              final Cursor cursor = lowLevel.query(Query.builder()
                      .table(updateQuery.table())
                      .where(nullableString(updateQuery.where()))
                      .whereArgs((Object[]) nullableArrayOfStringsFromListOfStrings(updateQuery.whereArgs()))
                      .build());
  
              final PutResult putResult;
  
              try {
                  final ContentValues contentValues = mapToContentValues(object);
  
                  if (cursor.getCount() == 0) {
                      final InsertQuery insertQuery = mapToInsertQuery(object);
                      final long insertedId = lowLevel.insert(insertQuery, contentValues);
                      putResult = PutResult.newInsertResult(insertedId, insertQuery.table(), insertQuery.affectsTags());
                  } else {
                      final int numberOfRowsUpdated = lowLevel.update(updateQuery, contentValues);
                      putResult = PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table(), updateQuery.affectsTags());
                  }
              } finally {
                  cursor.close();
              }
  
              // everything okay
              lowLevel.setTransactionSuccessful();
  
              return putResult;
          } finally {
              // in case of bad situations, db won't be affected
              lowLevel.endTransaction();
          }
      }
docs: {@inheritDoc}