2016-07-27 62 views
0

我正在使用sqlite.swift进行数据库创建。我在这个链接http://masteringswift.blogspot.in/2015/09/create-data-access-layer-with.html的帮助下创建了一个班级。我想在球员表格引用的teamID(column)上创建一个外键作为team table teamID(column)。如何使用数据模型在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无法使用类型为'(表达式,表达式) –

+0

的任何人建议我来调用“foreignkey”。 –

回答

0

1.检查您的陈述。对于斯威夫特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.You还需要下面的代码在你的PlayerDataHelper类

teamTable = Table("Team") 

参考:SQLite.swift ~> 0.11.4 GitHub Documentation

相关问题