В моем предыдущем вопросе: Как создать фильтр, который выполняет SQL-эквивалент WHERE ... IN для SQLite.Swift
Я спросил, как сделать WHERE...IN в Swift.
Теперь, как мне отфильтровать необязательные выражения?
У меня есть версионная база данных, которая позволяет мне добавлять столбцы в таблицы после ее создания. И для этого я создал столбец с
static let timeTag = Expression<String?>("timeTag")
а потом позвонил
try DB.run("PRAGMA user_version = 2")
let query = table.addColumn(timeTag)
let _ = try DB.run(query)
все это работает, и в таблице действительно есть этот столбец, и я могу добавить данные в столбец и т. д.
обычно, когда мне нужно фильтровать в других столбцах, я делаю
table.filter(self.id == id && self.name == name)
и когда мне нужно сделать, где в,
table.filter((myNameArray.contains(self.name))
теперь я хочу отфильтровать столбец timeTag с помощью массива timeTagArray
, который представляет собой массив требуемых timeTags для поиска. Я старался
table.filter(timeTagArray.contains(self.timeTag))
и пример таблицы:
+----+-------+-----------+
| id | name | timetag |
+----+-------+-----------+
| 1 | Joe | Morning |
+----+-------+-----------+
| 2 | Alan | Afternoon |
+----+-------+-----------+
| 3 | Brad | Morning |
+----+-------+-----------+
| 4 | Ian | Evening |
+----+-------+-----------+
| 5 | Louis | Midnight |
+----+-------+-----------+
если мой timeTagArray = ["Morning", "Midnight"]
, то я должен вернуть строки 1, 3, 5.
но это дает мне ошибку, которая говорит Cannot assign value of type 'Expression<Bool?>' (aka 'Expression<Optional<Bool>>') to type 'Expression<Bool>'
Bool?
иBool
не равны. Вам просто нужно развернуть необязательный элемент (но я не вижу, где происходит фактическое сравнение). - person DJohnson   schedule 07.06.2016Expression
, и я не уверен, как это работает... Я полагаю, что ошибка возникает из-за частиtimeTagArray.contains(self.timeTag)
, посколькуself.timeTag
являетсяExpression<String?>
, и поэтому выполнение содержимого даетExpression<Bool?>
, который нельзя использовать в функции.filter
- person stephw   schedule 07.06.2016filter(timeTagArray.contains(self.timeTag))
, но на этот раз без ошибок. - person Gwendal Roué   schedule 08.06.2016[String].contains
должен взятьExpression<Bool?>
. Я проверил следующее на игровой площадке, и, похоже, это сработало:let timeTag = Expression<String?>("timeTag"); let table = Table("table"); let timeTagArray = ["Morning", "Midnight"]; table.filter(timeTagArray.contains(timeTag))
- person stephencelis   schedule 09.06.2016