2 // ServerDataStore.swift
5 // Created by Hori,Masaki on 2017/01/07.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 extension CoreDataConfiguration {
13 static let kcd = CoreDataConfiguration("KCD", tryRemake: true)
16 final class ServerDataStore: CoreDataAccessor, CoreDataManager {
18 static let core = CoreDataCore(.kcd)
20 static let `default` = ServerDataStore(type: .reader)
22 class func oneTimeEditor() -> ServerDataStore {
24 return ServerDataStore(type: .editor)
27 required init(type: CoreDataManagerType) {
29 context = ServerDataStore.context(for: type)
37 let context: NSManagedObjectContext
40 extension ServerDataStore {
42 func airBases() -> [AirBase] {
44 guard let airbase = try? objects(of: AirBase.entity) else { return [] }
49 func airBase(area: Int, base: Int) -> AirBase? {
51 let p = NSPredicate(format: "area_id == %ld AND rid == %ld", area, base)
53 guard let airBases = try? objects(of: AirBase.entity, predicate: p) else { return nil }
58 func createAirBasePlaneInfo() -> AirBasePlaneInfo? {
60 return insertNewObject(for: AirBasePlaneInfo.entity)
63 func basic() -> Basic? {
65 guard let basics = try? objects(of: Basic.entity) else { return nil }
70 func createBasic() -> Basic? {
72 return insertNewObject(for: Basic.entity)
75 func decksSortedById() -> [Deck] {
77 let sortDec = NSSortDescriptor(key: "id", ascending: true)
79 guard let decks = try? objects(of: Deck.entity, sortDescriptors: [sortDec]) else { return [] }
84 func deck(by id: Int) -> Deck? {
86 let p = NSPredicate(format: "id = %ld", id)
88 guard let decks = try? objects(of: Deck.entity, predicate: p) else { return nil }
93 func kenzoDock(by dockId: Int) -> KenzoDock? {
95 let dockPredicate = NSPredicate(format: "id = %ld", dockId)
97 guard let kenzoDocks = try? objects(of: KenzoDock.entity, predicate: dockPredicate) else { return nil }
99 return kenzoDocks.first
102 func mapArea(by id: Int) -> MasterMapArea? {
103 let predicate = NSPredicate(format: "id = %ld", id)
104 guard let mapAreas = try? objects(of: MasterMapArea.entity, predicate: predicate) else { return nil }
106 return mapAreas.first
109 func mapInfo(area: Int, no: Int) -> MasterMapInfo? {
111 let predicate = NSPredicate(format: "maparea_id = %ld AND %K = %ld", area, "no", no)
113 guard let mapInfos = try? objects(of: MasterMapInfo.entity, predicate: predicate) else { return nil }
115 return mapInfos.first
118 func masterMission(by id: Int) -> MasterMission? {
120 let p = NSPredicate(format: "id = %ld", id)
122 guard let missions = try? objects(of: MasterMission.entity, predicate: p) else { return nil }
124 return missions.first
127 func masterShips() -> [MasterShip] {
129 guard let ships = try? objects(of: MasterShip.entity) else { return [] }
134 func sortedMasterShipsById() -> [MasterShip] {
136 let sortDesc = NSSortDescriptor(key: "id", ascending: true)
138 guard let ships = try? objects(of: MasterShip.entity, sortDescriptors: [sortDesc]) else { return [] }
143 func masterShip(by id: Int) -> MasterShip? {
145 let p = NSPredicate(format: "id = %ld", id)
147 guard let ships = try? objects(of: MasterShip.entity, predicate: p) else { return nil }
152 func sortedMasterSlotItemsById() -> [MasterSlotItem] {
154 let sortDesc = NSSortDescriptor(key: "id", ascending: true)
156 guard let masterSlotItems = try? objects(of: MasterSlotItem.entity, sortDescriptors: [sortDesc]) else { return [] }
158 return masterSlotItems
161 func masterSlotItems() -> [MasterSlotItem] {
163 guard let masterSlotItems = try? objects(of: MasterSlotItem.entity) else { return [] }
165 return masterSlotItems
168 func masterSlotItem(by id: Int) -> MasterSlotItem? {
170 let p = NSPredicate(format: "id = %ld", id)
172 guard let masterSlotItems = try? objects(of: MasterSlotItem.entity, predicate: p) else { return nil }
174 return masterSlotItems.first
177 func masterSlotItemEquipType(by id: Int) -> MasterSlotItemEquipType? {
179 let predicate = NSPredicate(format: "id = %ld", id)
181 guard let types = try? objects(of: MasterSlotItemEquipType.entity, predicate: predicate) else { return nil }
186 func masterSTypes() -> [MasterSType] {
188 guard let masterSTypes = try? objects(of: MasterSType.entity) else { return [] }
193 func sortedMasterSTypesById() -> [MasterSType] {
195 let sortDesc = NSSortDescriptor(key: "id", ascending: true)
197 guard let masterSTypes = try? objects(of: MasterSType.entity, sortDescriptors: [sortDesc]) else { return [] }
202 func material() -> Material? {
204 guard let materials = try? objects(of: Material.entity) else { return nil }
206 return materials.first
209 func createMaterial() -> Material? {
211 return insertNewObject(for: Material.entity)
214 func nyukyoDock(by id: Int) -> NyukyoDock? {
216 let p = NSPredicate(format: "id = %ld", id)
218 guard let ndocks = try? objects(of: NyukyoDock.entity, predicate: p) else { return nil }
223 func ships(byDeckId deckId: Int) -> [Ship] {
225 let predicate = NSPredicate(format: "id = %d", deckId)
227 guard let decks = try? objects(of: Deck.entity, predicate: predicate) else { return [] }
228 guard let deck = decks.first else { return [] }
233 func ship(by shipId: Int) -> Ship? {
235 if shipId < 1 { return nil }
237 let predicate = NSPredicate(format: "id = %d", shipId)
239 guard let ships = try? objects(of: Ship.entity, predicate: predicate) else { return nil }
244 func ships(by shipId: Int) -> [Ship] {
246 let predicate = NSPredicate(format: "id = %d", shipId)
248 guard let ships = try? objects(of: Ship.entity, predicate: predicate) else { return [] }
253 func ships(exclude shipIds: [Int]) -> [Ship] {
255 let predicate = NSPredicate(format: "NOT id IN %@", shipIds)
257 guard let ships = try? objects(of: Ship.entity, predicate: predicate) else { return [] }
262 func shipsInFleet() -> [Ship] {
264 let predicate = NSPredicate(format: "NOT fleet = 0")
266 guard let ships = try? objects(of: Ship.entity, predicate: predicate) else { return [] }
271 func createShip() -> Ship? {
273 return insertNewObject(for: Ship.entity)
276 func masterSlotItemID(by slotItemId: Int) -> Int {
278 if slotItemId < 1 { return 0 }
280 let predicate = NSPredicate(format: "id = %d", argumentArray: [slotItemId])
282 guard let slotItems = try? objects(of: SlotItem.entity, predicate: predicate) else { return 0 }
283 guard let slotItem = slotItems.first else { return 0 }
285 return slotItem.master_slotItem.id
288 func slotItem(by itemId: Int) -> SlotItem? {
290 let p = NSPredicate(format: "id = %ld", itemId)
292 guard let slotItems = try? objects(of: SlotItem.entity, predicate: p) else { return nil }
294 return slotItems.first
297 func sortedSlotItemsById() -> [SlotItem] {
299 let sortDesc = NSSortDescriptor(key: "id", ascending: true)
301 guard let slotItems = try? objects(of: SlotItem.entity, sortDescriptors: [sortDesc]) else { return [] }
306 func slotItems() -> [SlotItem] {
308 guard let slotItems = try? objects(of: SlotItem.entity) else { return [] }
313 func slotItems(in itemIds: [Int]) -> [SlotItem] {
315 let predicate = NSPredicate(format: "id IN %@", itemIds)
317 guard let slotItems = try? objects(of: SlotItem.entity, predicate: predicate) else { return [] }
322 func slotItems(exclude itemIds: [Int]) -> [SlotItem] {
324 let predicate = NSPredicate(format: "NOT id IN %@", itemIds)
326 guard let slotItems = try? objects(of: SlotItem.entity, predicate: predicate) else { return [] }
331 func createSlotItem() -> SlotItem? {
333 return insertNewObject(for: SlotItem.entity)
336 func quests() -> [Quest] {
338 guard let quests = try? objects(of: Quest.entity) else { return [] }
343 func quest(by no: Int) -> Quest? {
345 let p = NSPredicate(format: "%K = %ld", "no", no)
347 guard let quests = try? objects(of: Quest.entity, predicate: p) else { return nil }
352 func quests(in range: CountableClosedRange<Int>) -> [Quest] {
354 let p = NSPredicate(format: "%K In %@", "no", range.map {$0})
356 guard let quests = try? objects(of: Quest.entity, predicate: p) else { return [] }
361 func sortedQuestByNo() -> [Quest] {
363 let sortDesc = NSSortDescriptor(key: "no", ascending: true)
365 guard let quests = try? objects(of: Quest.entity, sortDescriptors: [sortDesc]) else { return [] }
370 func createQuest() -> Quest? {
372 return insertNewObject(for: Quest.entity)