2016-07-27 2 views
0

Я использую sqlite.swift для создания базы данных. Я создал класс, используя с помощью этой ссылки http://masteringswift.blogspot.in/2015/09/create-data-access-layer-with.html. Я хочу создать внешний ключ в teamID (столбец) в ссылке таблицы игроков в качестве команды teamID команды (столбец).Как создать внешний ключ в sqlite.swift с использованием модели данных

Вот вспомогательный класс для команды и игрока таблицы:

class TeamDataHelper: DataHelperProtocol { 
static let TABLE_NAME = "Teams" 

static let table = Table(TABLE_NAME) 
static let teamId = Expression<Int64>("teamid") 
static let city = Expression<String>("city") 
static let nickName = Expression<String>("nickname") 
static let abbreviation = Expression<String>("abbreviation") 


typealias T = Team 

static func createTable() throws { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    do { 
     let _ = try DB.run(table.create(ifNotExists: true) {t in 
      t.column(teamId, primaryKey: true) 
      t.column(city) 
      t.column(nickName) 
      t.column(abbreviation) 
      }) 

    } catch _ { 
     // Error throw if table already exists 
    } 

} 

static func insert(item: T) throws -> Int64 { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    if (item.city != nil && item.nickName != nil && item.abbreviation != nil) { 
     let insert = table.insert(city <- item.city!, nickName <- item.nickName!, abbreviation <- item.abbreviation!) 
     do { 
      let rowId = try DB.run(insert) 
      guard rowId > 0 else { 
       throw DataAccessError.Insert_Error 
      } 
      return rowId 
     } catch _ { 
      throw DataAccessError.Insert_Error 
     } 
    } 
    throw DataAccessError.Nil_In_Data 

} 

static func delete (item: T) throws -> Void { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    if let id = item.teamId { 
     let query = table.filter(teamId == id) 
     do { 
      let tmp = try DB.run(query.delete()) 
      guard tmp == 1 else { 
       throw DataAccessError.Delete_Error 
      } 
     } catch _ { 
      throw DataAccessError.Delete_Error 
     } 
    } 
} 

static func find(id: Int64) throws -> T? { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    let query = table.filter(teamId == id) 
    let items = try DB.prepare(query) 
    for item in items { 
     return Team(teamId: item[teamId] , city: item[city], nickName: item[nickName], abbreviation: item[abbreviation]) 
    } 

    return nil 

} 

static func findAll() throws -> [T]? { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    var retArray = [T]() 
    let items = try DB.prepare(table) 
    for item in items { 
     retArray.append(Team(teamId: item[teamId], city: item[city], nickName: item[nickName], abbreviation: item[abbreviation])) 
    } 

    return retArray 

} 
} 



class PlayerDataHelper: DataHelperProtocol { 
static let TABLE_NAME = "Players" 

static let playerId = Expression<Int64>("playerid") 
static let firstName = Expression<String>("firstName") 
static let lastName = Expression<String>("lastName") 
static let number = Expression<Int>("number") 
static let teamId = Expression<Int64>("teamid") 
static let position = Expression<String>("position") 


static let table = Table(TABLE_NAME) 

typealias T = Player 

static func createTable() throws { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    do { 
     _ = try DB.run(table.create(ifNotExists: true) {t in 

      t.column(playerId, primaryKey: true) 
      t.column(firstName) 
      t.column(lastName) 
      t.column(number) 
      t.column(teamId) 
      t.column(position) 


      }) 
    } catch _ { 
     // Error thrown when table exists 
    } 
} 

static func insert(item: T) throws -> Int64 { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    if (item.firstName != nil && item.lastName != nil && item.teamId != nil && item.position != nil) { 
     let insert = table.insert(firstName <- item.firstName!, number <- item.number!, lastName <- item.lastName!, teamId <- item.teamId!, position <- item.position!.rawValue) 
     do { 
      let rowId = try DB.run(insert) 
      guard rowId >= 0 else { 
       throw DataAccessError.Insert_Error 
      } 
      return rowId 
     } catch _ { 
      throw DataAccessError.Insert_Error 
     } 
    } 
    throw DataAccessError.Nil_In_Data 
} 

static func delete (item: T) throws -> Void { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    if let id = item.playerId { 
     let query = table.filter(playerId == id) 
     do { 
      let tmp = try DB.run(query.delete()) 
      guard tmp == 1 else { 
       throw DataAccessError.Delete_Error 
      } 
     } catch _ { 
      throw DataAccessError.Delete_Error 
     } 
    } 

} 

static func find(id: Int64) throws -> T? { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    let query = table.filter(playerId == id) 
    let items = try DB.prepare(query) 
    for item in items { 
     return Player(playerId: item[playerId], firstName: item[firstName], lastName: item[lastName], number: item[number], teamId: item[teamId], position: Positions(rawValue: item[position])) 
    } 

    return nil 

} 

static func findAll() throws -> [T]? { 
    guard let DB = SQLiteDataStore.sharedInstance.BBDB else { 
     throw DataAccessError.Datastore_Connection_Error 
    } 
    var retArray = [T]() 
    let items = try DB.prepare(table) 
    for item in items { 
     retArray.append(Player(playerId: item[playerId], firstName: item[firstName], lastName: item[lastName], number: item[number], teamId: item[teamId], position: Positions(rawValue: item[position]))) 
    } 

    return retArray 
} 
} 

В приведенной выше таблице игрока, я хочу, чтобы создать внешний ключ для TeamID как ссылка команды таблицы TeamID. Если я создаю внешний ключ, например «t.foreignKey (teamID, on: TeamDataHelper.teamID)», он дает ошибку.

может кто-нибудь предложить мне любую помощь.

+0

Что такое ошибка? – polku

+0

@polku не может вызывать «foreignkey» с списком аргументов типа »(выражение , on: Expression ) –

+0

Кто-нибудь предлагает мне. –

ответ

0

1.Проверьте ваше заявление. Для Swift 4 (и Xcode 9), это должно быть:

t.foreignKey(teamId, references: teamTable, teamId, delete: .setNull) 
// FOREIGN KEY("teamid") REFERENCES "Team"("teamid") ON DELETE SET NULL 

Положите его в DB.run в CreateTable() FUNC в классе PlayerDataHelper

2.Вы также нужно следующий код в вашем классе PlayerDataHelper

teamTable = Table("Team") 

ссылка: SQLite.swift ~> 0.11.4 GitHub Documentation

Смежные вопросы