code: def _ReadRecord(self, tables, file_object, record_offset, record_type):
      
      table = tables.get(record_type, None)
      if not table:
        raise errors.ParseError(
            'Missing table for relation identifier: 0x{0:08}'.format(record_type))
  
      record_header = self._ReadRecordHeader(file_object, record_offset)
  
      record = collections.OrderedDict()
  
      if table.columns:
        attribute_value_offsets = self._ReadRecordAttributeValueOffset(
            file_object, record_offset + 24, len(table.columns))
  
      file_offset = file_object.tell()
      record_data_offset = file_offset - record_offset
      record_data_size = record_header.data_size - (file_offset - record_offset)
      record_data = file_object.read(record_data_size)
  
      if record_header.key_data_size > 0:
        record['_key_'] = record_data[:record_header.key_data_size]
  
      if table.columns:
        for index, column in enumerate(table.columns):
          attribute_data_read_function = self._ATTRIBUTE_DATA_READ_FUNCTIONS.get(
              column.attribute_data_type, None)
          if attribute_data_read_function:
            attribute_data_read_function = getattr(
                self, attribute_data_read_function, None)
  
          if not attribute_data_read_function:
            attribute_value = None
          else:
            attribute_value = attribute_data_read_function(
                record_data, record_offset, record_data_offset,
                attribute_value_offsets[index])
  
          record[column.attribute_name] = attribute_value
  
      table.records.append(record)
docs: Reads the record.
  
      Args:
        tables (dict[int, KeychainDatabaseTable]): tables per identifier.
        file_object (file): file-like object.
        record_offset (int): offset of the record relative to the start of
            the file.
        record_type (int): record type, which should correspond to a relation
            identifier of a table defined in the schema.
  
      Raises:
        ParseError: if the record cannot be read.