initial swift data conversion

This commit is contained in:
Garth Vander Houwen 2026-04-16 12:10:00 -07:00
parent 183924d4dc
commit b2c72ae166
130 changed files with 2939 additions and 2269 deletions

View file

@ -0,0 +1,26 @@
//
// ChannelEntity.swift
// Meshtastic
//
// SwiftData model for channels.
//
import Foundation
import SwiftData
@Model
final class ChannelEntity {
var downlinkEnabled: Bool = false
var id: Int32 = 0
var index: Int32 = 0
var mute: Bool = false
var name: String?
var positionPrecision: Int32 = 32
var psk: Data?
var role: Int32 = 0
var uplinkEnabled: Bool = false
var myInfoChannel: MyInfoEntity?
init() {}
}

View file

@ -0,0 +1,320 @@
//
// ConfigModels.swift
// Meshtastic
//
// SwiftData models for all device and module configuration entities.
//
import Foundation
import SwiftData
@Model
final class AmbientLightingConfigEntity {
var blue: Int32 = 0
var current: Int32 = 0
var green: Int32 = 0
var ledState: Bool = false
var red: Int32 = 0
var ambientLightingConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class BluetoothConfigEntity {
var deviceLoggingEnabled: Bool = false
var enabled: Bool = false
var fixedPin: Int32 = 123456
var mode: Int32 = 0
var bluetoothConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class CannedMessageConfigEntity {
var enabled: Bool = false
var inputbrokerEventCcw: Int32 = 0
var inputbrokerEventCw: Int32 = 0
var inputbrokerEventPress: Int32 = 0
var inputbrokerPinA: Int32 = 0
var inputbrokerPinB: Int32 = 0
var inputbrokerPinPress: Int32 = 0
var messages: String?
var rotary1Enabled: Bool = false
var sendBell: Bool = false
var updown1Enabled: Bool = false
var cannedMessagesConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class DetectionSensorConfigEntity {
var enabled: Bool = false
var minimumBroadcastSecs: Int32 = 0
var monitorPin: Int32 = 0
var name: String?
var sendBell: Bool = false
var stateBroadcastSecs: Int32 = 0
var triggerType: Int32 = 0
var usePullup: Bool = false
var detectionSensorConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class DeviceConfigEntity {
var buttonGpio: Int32 = 0
var buzzerGpio: Int32 = 0
var debugLogEnabled: Bool = false
var disableTripleClick: Bool = false
var doubleTapAsButtonPress: Bool = false
var isManaged: Bool = false
var ledHeartbeatEnabled: Bool = true
var nodeInfoBroadcastSecs: Int32 = 0
var rebroadcastMode: Int32 = 0
var role: Int32 = 0
var serialEnabled: Bool = false
var tripleClickAsAdHocPing: Bool = true
var tzdef: String?
var deviceConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class DisplayConfigEntity {
var compassNorthTop: Bool = false
var displayMode: Int32 = 0
var flipScreen: Bool = false
var headingBold: Bool = true
var oledType: Int32 = 0
var screenCarouselInterval: Int32 = 0
var screenOnSeconds: Int32 = 0
var units: Int32 = 0
var use12HClock: Bool = false
var wakeOnTapOrMotion: Bool = false
var displayConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class ExternalNotificationConfigEntity {
var active: Bool = false
var alertBell: Bool = false
var alertBellBuzzer: Bool = false
var alertBellVibra: Bool = false
var alertMessage: Bool = false
var alertMessageBuzzer: Bool = false
var alertMessageVibra: Bool = false
var enabled: Bool = false
var nagTimeout: Int32 = 0
var output: Int32 = 0
var outputBuzzer: Int32 = 0
var outputMilliseconds: Int32 = 0
var outputVibra: Int32 = 0
var useI2SAsBuzzer: Bool = false
var usePWM: Bool = true
var externalNotificationConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class LoRaConfigEntity {
var bandwidth: Int32 = 0
var channelNum: Int32 = 0
var codingRate: Int32 = 0
var frequencyOffset: Float = 0
var hopLimit: Int32 = 0
var ignoreMqtt: Bool = false
var modemPreset: Int32 = 0
var okToMqtt: Bool = false
var overrideDutyCycle: Bool = false
var overrideFrequency: Float = 0.0
var regionCode: Int32 = 0
var spreadFactor: Int32 = 0
var sx126xRxBoostedGain: Bool = false
var txEnabled: Bool = true
var txPower: Int32 = 0
var usePreset: Bool = true
var loRaConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class MQTTConfigEntity {
var address: String?
var enabled: Bool = false
var encryptionEnabled: Bool = false
var jsonEnabled: Bool = false
var mapPositionPrecision: Int32 = 13
var mapPublishIntervalSecs: Int32 = 0
var mapReportingEnabled: Bool = false
var mapReportingShouldReportLocation: Bool = false
var password: String?
var proxyToClientEnabled: Bool = false
var root: String? = "msh"
var tlsEnabled: Bool = false
var username: String?
var mqttConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class NetworkConfigEntity {
var dns: Int32 = 0
var enabledProtocols: Int32 = 0
var ethEnabled: Bool = false
var gateway: Int32 = 0
var ip: Int32 = 0
var ntpServer: String?
var subnet: Int32 = 0
var wifiEnabled: Bool = false
var wifiMode: Int32 = 0
var wifiPsk: String?
var wifiSsid: String?
var networkConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class PaxCounterConfigEntity {
var bleThreshold: Int32 = 0
var enabled: Bool = false
var updateInterval: Int32 = 0
var wifiThreshold: Int32 = -80
var paxCounterConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class PositionConfigEntity {
var broadcastSmartMinimumDistance: Int32 = 0
var broadcastSmartMinimumIntervalSecs: Int32 = 0
var deviceGpsEnabled: Bool = false
var fixedPosition: Bool = false
var gpsAttemptTime: Int32 = 0
var gpsEnGpio: Int32 = 0
var gpsMode: Int32 = 0
var gpsUpdateInterval: Int32 = 0
var positionBroadcastSeconds: Int32 = 0
var positionFlags: Int32 = 0
var rxGpio: Int32 = 0
var smartPositionEnabled: Bool = false
var txGpio: Int32 = 0
var positionConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class PowerConfigEntity {
var adcMultiplierOverride: Float = 0
var deviceBatteryInaAddress: Int32 = 0
var isPowerSaving: Bool = false
var lsSecs: Int32 = 0
var minWakeSecs: Int32 = 0
var onBatteryShutdownAfterSecs: Int32 = 0
var waitBluetoothSecs: Int32 = 0
var powerConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class RangeTestConfigEntity {
var enabled: Bool = false
var save: Bool = false
var sender: Int32 = 0
var rangeTestConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class RTTTLConfigEntity {
var ringtone: String?
var rtttlConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class SecurityConfigEntity {
var adminChannelEnabled: Bool = false
var adminKey: Data?
var adminKey2: Data?
var adminKey3: Data?
var bluetoothLoggingEnabled: Bool = false
var debugLogApiEnabled: Bool = false
var isManaged: Bool = false
var privateKey: Data?
var publicKey: Data?
var serialEnabled: Bool = false
var securityConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class SerialConfigEntity {
var baudRate: Int32 = 0
var echo: Bool = false
var enabled: Bool = false
var mode: Int32 = 0
var overrideConsoleSerialPort: Bool = false
var rxd: Int32 = 0
var timeout: Int32 = 0
var txd: Int32 = 0
var serialConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class StoreForwardConfigEntity {
var enabled: Bool = false
var heartbeat: Bool = false
var historyReturnMax: Int32 = 0
var historyReturnWindow: Int32 = 0
var isRouter: Bool = false
var lastHeartbeat: Date?
var lastRequest: Int32 = 0
var records: Int32 = 0
var storeForwardConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class TAKConfigEntity {
var role: Int32 = 0
var team: Int32 = 0
var takConfigNode: NodeInfoEntity?
init() {}
}
@Model
final class TelemetryConfigEntity {
var deviceTelemetryEnabled: Bool = false
var deviceUpdateInterval: Int32 = 0
var environmentDisplayFahrenheit: Bool = false
var environmentMeasurementEnabled: Bool = false
var environmentScreenEnabled: Bool = false
var environmentUpdateInterval: Int32 = 0
var powerMeasurementEnabled: Bool = false
var powerScreenEnabled: Bool = false
var powerUpdateInterval: Int32 = 0
var telemetryConfigNode: NodeInfoEntity?
init() {}
}

View file

@ -0,0 +1,28 @@
//
// DeviceMetadataEntity.swift
// Meshtastic
//
// SwiftData model for device metadata.
//
import Foundation
import SwiftData
@Model
final class DeviceMetadataEntity {
var canShutdown: Bool = false
var deviceStateVersion: Int32 = 0
var excludedModules: Int32 = 0
var firmwareVersion: String?
var hasBluetooth: Bool = false
var hasEthernet: Bool = false
var hasWifi: Bool = false
var hwModel: String?
var positionFlags: Int32 = 0
var role: Int32 = 0
var time: Date?
var metadataNode: NodeInfoEntity?
init() {}
}

View file

@ -0,0 +1,53 @@
//
// MeshtasticSchema.swift
// Meshtastic
//
// SwiftData schema definition and migration plan for migrating from Core Data.
//
import Foundation
import SwiftData
/// All model types in the Meshtastic schema
enum MeshtasticSchema {
static var allModels: [any PersistentModel.Type] {
[
// Core entities
NodeInfoEntity.self,
UserEntity.self,
MyInfoEntity.self,
MessageEntity.self,
ChannelEntity.self,
PositionEntity.self,
WaypointEntity.self,
DeviceMetadataEntity.self,
TelemetryEntity.self,
PaxCounterEntity.self,
TraceRouteEntity.self,
TraceRouteHopEntity.self,
RouteEntity.self,
LocationEntity.self,
// Config entities
AmbientLightingConfigEntity.self,
BluetoothConfigEntity.self,
CannedMessageConfigEntity.self,
DetectionSensorConfigEntity.self,
DeviceConfigEntity.self,
DisplayConfigEntity.self,
ExternalNotificationConfigEntity.self,
LoRaConfigEntity.self,
MQTTConfigEntity.self,
NetworkConfigEntity.self,
PaxCounterConfigEntity.self,
PositionConfigEntity.self,
PowerConfigEntity.self,
RangeTestConfigEntity.self,
RTTTLConfigEntity.self,
SecurityConfigEntity.self,
SerialConfigEntity.self,
StoreForwardConfigEntity.self,
TAKConfigEntity.self,
TelemetryConfigEntity.self,
]
}
}

View file

@ -0,0 +1,43 @@
//
// MessageEntity.swift
// Meshtastic
//
// SwiftData model for messages.
//
import Foundation
import SwiftData
@Model
final class MessageEntity {
var ackError: Int32 = 0
var ackSNR: Float = 0.0
var ackTimestamp: Int32 = 0
var admin: Bool = false
var adminDescription: String?
var channel: Int32 = 0
var isEmoji: Bool = false
var messageId: Int64 = 0
var messagePayload: String? = ""
var messagePayloadMarkdown: String?
var messagePayloadTranslated: String?
var messagePayloadTranslatedMarkdown: String?
var messageTimestamp: Int32 = 0
var pkiEncrypted: Bool = false
var portNum: Int32 = 0
var publicKey: Data?
var read: Bool = false
var realACK: Bool = false
var receivedACK: Bool = false
var relayNode: Int64 = 0
var relays: Int16 = 0
var replyID: Int64 = 0
var rssi: Int32 = 0
var showTranslatedMessage: Bool = false
var snr: Float = 0.0
var fromUser: UserEntity?
var toUser: UserEntity?
init() {}
}

View file

@ -48,7 +48,7 @@ class MetricsTableColumn: ObservableObject {
visible: Bool = true,
@ViewBuilder tableBody: @escaping (MetricsTableColumn, Value) -> TableContent?
) {
// This works because TelemetryEntity is an NSManagedObject and derrived from NSObject
// This works because TelemetryEntity is an @Model and conforms to PersistentModel
self.id = id
self.name = name
self.abbreviatedName = abbreviatedName

View file

@ -59,7 +59,7 @@ class MetricsChartSeries: ObservableObject {
@ChartContentBuilder chartBody: @escaping (MetricsChartSeries, ClosedRange<Float>?, Date, Value) -> ChartBody?
) {
// This works because TelemetryEntity is an NSManagedObject and derrived from NSObject
// This works because TelemetryEntity is an @Model and conforms to PersistentModel
self.id = id
self.name = name
self.abbreviatedName = abbreviatedName

View file

@ -0,0 +1,27 @@
//
// MyInfoEntity.swift
// Meshtastic
//
// SwiftData model for connected device info.
//
import Foundation
import SwiftData
@Model
final class MyInfoEntity {
var bleName: String?
var deviceId: Data?
var minAppVersion: Int32 = 0
var myNodeNum: Int64 = 0
var peripheralId: String?
var rebootCount: Int32 = 0
var registered: Bool = false
@Relationship(deleteRule: .cascade, inverse: \ChannelEntity.myInfoChannel)
var channels: [ChannelEntity] = []
var myInfoNode: NodeInfoEntity?
init() {}
}

View file

@ -0,0 +1,112 @@
//
// NodeInfoEntity.swift
// Meshtastic
//
// SwiftData model for the central node information entity.
//
import Foundation
import SwiftData
@Model
final class NodeInfoEntity {
var bleName: String?
var channel: Int32 = 0
var favorite: Bool = false
var firstHeard: Date?
var hopsAway: Int32 = 0
var id: Int64 = 0
var ignored: Bool = false
var lastHeard: Date?
var num: Int64 = 0
var peripheralId: String?
var rssi: Int32 = 0
var sessionExpiration: Date?
var sessionPasskey: Data?
var snr: Float = 0.0
var viaMqtt: Bool = false
// Config relationships (to-one, cascade)
@Relationship(deleteRule: .cascade, inverse: \AmbientLightingConfigEntity.ambientLightingConfigNode)
var ambientLightingConfig: AmbientLightingConfigEntity?
@Relationship(deleteRule: .cascade, inverse: \BluetoothConfigEntity.bluetoothConfigNode)
var bluetoothConfig: BluetoothConfigEntity?
@Relationship(deleteRule: .cascade, inverse: \CannedMessageConfigEntity.cannedMessagesConfigNode)
var cannedMessageConfig: CannedMessageConfigEntity?
@Relationship(deleteRule: .cascade, inverse: \DetectionSensorConfigEntity.detectionSensorConfigNode)
var detectionSensorConfig: DetectionSensorConfigEntity?
@Relationship(deleteRule: .cascade, inverse: \DeviceConfigEntity.deviceConfigNode)
var deviceConfig: DeviceConfigEntity?
@Relationship(deleteRule: .cascade, inverse: \DisplayConfigEntity.displayConfigNode)
var displayConfig: DisplayConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \ExternalNotificationConfigEntity.externalNotificationConfigNode)
var externalNotificationConfig: ExternalNotificationConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \LoRaConfigEntity.loRaConfigNode)
var loRaConfig: LoRaConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \DeviceMetadataEntity.metadataNode)
var metadata: DeviceMetadataEntity?
@Relationship(deleteRule: .nullify, inverse: \MQTTConfigEntity.mqttConfigNode)
var mqttConfig: MQTTConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \MyInfoEntity.myInfoNode)
var myInfo: MyInfoEntity?
@Relationship(deleteRule: .nullify, inverse: \NetworkConfigEntity.networkConfigNode)
var networkConfig: NetworkConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \PaxCounterEntity.paxNode)
var pax: [PaxCounterEntity] = []
@Relationship(deleteRule: .nullify, inverse: \PaxCounterConfigEntity.paxCounterConfigNode)
var paxCounterConfig: PaxCounterConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \PositionConfigEntity.positionConfigNode)
var positionConfig: PositionConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \PositionEntity.nodePosition)
var positions: [PositionEntity] = []
@Relationship(deleteRule: .nullify, inverse: \PowerConfigEntity.powerConfigNode)
var powerConfig: PowerConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \RangeTestConfigEntity.rangeTestConfigNode)
var rangeTestConfig: RangeTestConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \RTTTLConfigEntity.rtttlConfigNode)
var rtttlConfig: RTTTLConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \SecurityConfigEntity.securityConfigNode)
var securityConfig: SecurityConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \SerialConfigEntity.serialConfigNode)
var serialConfig: SerialConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \StoreForwardConfigEntity.storeForwardConfigNode)
var storeForwardConfig: StoreForwardConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \TAKConfigEntity.takConfigNode)
var takConfig: TAKConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \TelemetryEntity.nodeTelemetry)
var telemetries: [TelemetryEntity] = []
@Relationship(deleteRule: .nullify, inverse: \TelemetryConfigEntity.telemetryConfigNode)
var telemetryConfig: TelemetryConfigEntity?
@Relationship(deleteRule: .nullify, inverse: \TraceRouteEntity.node)
var traceRoutes: [TraceRouteEntity] = []
@Relationship(deleteRule: .nullify, inverse: \UserEntity.userNode)
var user: UserEntity?
init() {}
}

View file

@ -0,0 +1,29 @@
//
// PositionEntity.swift
// Meshtastic
//
// SwiftData model for node positions.
//
import Foundation
import SwiftData
@Model
final class PositionEntity {
var altitude: Int32 = 0
var heading: Int32 = 0
var latest: Bool = false
var latitudeI: Int32 = 0
var longitudeI: Int32 = 0
var precisionBits: Int32 = 32
var rssi: Int32 = 0
var satsInView: Int32 = 0
var seqNo: Int32 = 0
var snr: Float = 0.0
var speed: Int32 = 0
var time: Date?
var nodePosition: NodeInfoEntity?
init() {}
}

View file

@ -0,0 +1,53 @@
//
// RouteModels.swift
// Meshtastic
//
// SwiftData models for routes and locations.
//
import Foundation
import SwiftData
@Model
final class RouteEntity {
var color: Int64 = 0
var date: Date?
var distance: Double = 0
var elevationGain: Double = 0
var enabled: Bool = false
var endDate: Date?
var id: Int32 = 0
var name: String?
var notes: String?
@Relationship(deleteRule: .cascade, inverse: \LocationEntity.routeLocation)
var locations: [LocationEntity] = []
init() {}
}
@Model
final class LocationEntity {
var altitude: Int32 = 0
var heading: Int32 = 0
var id: Int32 = 0
var latitudeI: Int32 = 0
var longitudeI: Int32 = 0
var speed: Int32 = 0
var routeLocation: RouteEntity?
init() {}
}
@Model
final class PaxCounterEntity {
var ble: Int32 = 0
var time: Date?
var uptime: Int32 = 0
var wifi: Int32 = 0
var paxNode: NodeInfoEntity?
init() {}
}

View file

@ -0,0 +1,74 @@
//
// TelemetryEntity.swift
// Meshtastic
//
// SwiftData model for telemetry data.
// Replaces the manual Core Data TelemetryEntity+CoreDataClass/Properties files.
//
import Foundation
import SwiftData
@Model
final class TelemetryEntity {
// Non-optional scalars
var metricsType: Int32 = 0
var numOnlineNodes: Int32 = 0
var numPacketsRx: Int32 = 0
var numPacketsRxBad: Int32 = 0
var numPacketsTx: Int32 = 0
var numRxDupe: Int32 = 0
var numTotalNodes: Int32 = 0
var numTxRelay: Int32 = 0
var numTxRelayCanceled: Int32 = 0
var time: Date?
// Optional scalars (previously used @ManagedAttribute wrapper)
var airUtilTx: Float?
var barometricPressure: Float?
var batteryLevel: Int32?
var channelUtilization: Float?
var current: Float?
var distance: Float?
var gasResistance: Float?
var iaq: Int32?
var irLux: Float?
var lux: Float?
var powerCh1Current: Float?
var powerCh1Voltage: Float?
var powerCh2Current: Float?
var powerCh2Voltage: Float?
var powerCh3Current: Float?
var powerCh3Voltage: Float?
var radiation: Float?
var rainfall1H: Float?
var rainfall24H: Float?
var relativeHumidity: Float?
var rssi: Int32?
var snr: Float?
var soilMoisture: UInt32?
var soilTemperature: Float?
var temperature: Float?
var uptimeSeconds: Int32?
var uvLux: Float?
var voltage: Float?
var weight: Float?
var whiteLux: Float?
var windDirection: Int32?
var windGust: Float?
var windLull: Float?
var windSpeed: Float?
// Relationship
var nodeTelemetry: NodeInfoEntity?
// Computed property
var dewPoint: Float? {
guard let temp = self.temperature, let rh = self.relativeHumidity else {
return nil
}
return Float(calculateDewPoint(temp: temp, relativeHumidity: rh, convertToLocale: false))
}
init() {}
}

View file

@ -0,0 +1,46 @@
//
// TraceRouteModels.swift
// Meshtastic
//
// SwiftData models for trace routes and hops.
//
import Foundation
import SwiftData
@Model
final class TraceRouteEntity {
var hasPositions: Bool = false
var hopsBack: Int32 = 0
var hopsTowards: Int32 = 0
var id: Int64 = 0
var response: Bool = false
var routeBackText: String?
var routeText: String?
var sent: Bool = false
var snr: Float = 0.0
var time: Date?
@Relationship(deleteRule: .cascade, inverse: \TraceRouteHopEntity.traceRoute)
var hops: [TraceRouteHopEntity] = []
var node: NodeInfoEntity?
init() {}
}
@Model
final class TraceRouteHopEntity {
var altitude: Int32 = 0
var back: Bool = false
var latitudeI: Int32 = 0
var longitudeI: Int32 = 0
var name: String?
var num: Int64 = 0
var snr: Float = 0.0
var time: Date?
var traceRoute: TraceRouteEntity?
init() {}
}

View file

@ -0,0 +1,40 @@
//
// UserEntity.swift
// Meshtastic
//
// SwiftData model for user information.
//
import Foundation
import SwiftData
@Model
final class UserEntity {
var hwDisplayName: String?
var hwModel: String?
var hwModelId: Int32 = 0
var isLicensed: Bool = false
var keyMatch: Bool = true
var lastMessage: Date?
var longName: String?
var mute: Bool = false
var newPublicKey: Data?
var num: Int64 = 0
var numString: String?
var pkiEncrypted: Bool = false
var publicKey: Data?
var role: Int32 = 0
var shortName: String?
var unmessagable: Bool = false
var userId: String?
@Relationship(inverse: \MessageEntity.fromUser)
var sentMessages: [MessageEntity] = []
@Relationship(inverse: \MessageEntity.toUser)
var receivedMessages: [MessageEntity] = []
var userNode: NodeInfoEntity?
init() {}
}

View file

@ -0,0 +1,27 @@
//
// WaypointEntity.swift
// Meshtastic
//
// SwiftData model for waypoints.
//
import Foundation
import SwiftData
@Model
final class WaypointEntity {
var created: Date?
var createdBy: Int64 = 0
var expire: Date?
var icon: Int64 = 0
var id: Int64 = 0
var lastUpdated: Date?
var lastUpdatedBy: Int64 = 0
var latitudeI: Int32 = 0
var locked: Bool = false
var longDescription: String?
var longitudeI: Int32 = 0
var name: String?
init() {}
}