GRDB.swift v2.5.0 Release Notes

  • ๐Ÿš€ Released January 11, 2018 • diff

    ๐Ÿ›  Fixed

    • ๐Ÿ›  Transaction observers used to be notified of some database changes they were not interested into, in case of complex statements with side effects (foreign key cascades or sql triggers). This has been fixed.

    ๐Ÿ†• New

    • ๐Ÿ“š The query interface has learned to build requests from any key (primary keys and unique keys) (documentation):

      // SELECT * FROM players WHERE id = 1
      let request = Player.filter(key: 1)
      let player = try request.fetchOne(db)    // Player?
      
      // SELECT * FROM countries WHERE isoCode IN ('FR', 'US')
      let request = Country.filter(keys: ["FR", "US"])
      let countries = try request.fetchAll(db) // [Country]
      
      // SELECT * FROM players WHERE email = '[email protected]'
      let request = Player.filter(key: ["email": "[email protected]"])
      let player = try request.fetchOne(db)    // Player?
      

      This feature has been introduced in order to ease the use of RxGRDB:

      // New
      Player.filter(key: 1).rx
          .fetchOne(in: dbQueue)
          .subscribe(onNext: { player: Player? in
              print("Player 1 has changed")
          })
      

    API diff

     extension TableMapping {
    +    static func filter<PrimaryKeyType: DatabaseValueConvertible>(key: PrimaryKeyType?) -> QueryInterfaceRequest<Self>
    +    static func filter<Sequence: Swift.Sequence>(keys: Sequence) -> QueryInterfaceRequest<Self> where Sequence.Element: DatabaseValueConvertible
    +    static func filter(key: [String: DatabaseValueConvertible?]?) -> QueryInterfaceRequest<Self>
    +    static func filter(keys: [[String: DatabaseValueConvertible?]]) -> QueryInterfaceRequest<Self>
     }
    
     extension QueryInterfaceRequest where T: TableMapping {
    +    func filter<PrimaryKeyType: DatabaseValueConvertible>(key: PrimaryKeyType?) -> QueryInterfaceRequest<T>
    +    func filter<Sequence: Swift.Sequence>(keys: Sequence) -> QueryInterfaceRequest<T> where Sequence.Element: DatabaseValueConvertible
    +    func filter(key: [String: DatabaseValueConvertible?]?) -> QueryInterfaceRequest<T>
    +    func filter(keys: [[String: DatabaseValueConvertible?]]) -> QueryInterfaceRequest<T>
     }
    
     extension RowConvertible where Self: TableMapping {
    -    static func fetchOne(_ db: Database, key: [String: DatabaseValueConvertible?]) throws -> Self?
    +    static func fetchOne(_ db: Database, key: [String: DatabaseValueConvertible?]?) throws -> Self?
     }