Создание запроса и добавление результата в структуру с помощью Swift - PullRequest
0 голосов
/ 29 ноября 2018

Основываясь на руководстве по SQLite для Swift ( Ссылка ), я могу успешно выполнить запрос следующим образом (с необработанным запросом):

struct myStruct {
   var value1 = String()
   var value2 = String()
   var value3 = String()
   var value4 = String()
}

do {
   guard let queryResults = try? db.prepare("SELECT value1, value2, value3, value4 FROM table WHERE identifier = 0")
   else {
      print("ERROR")
      return
   }
   //first way to get data (works)
   for row in queryResults {
      let data = myStruct(value1: row[0] as! String, value2: row[1] as! String, value3: "", eventDate: row[2] as! String, value4: row[3] as! String)
      tableViewData.append(data)
   }
   //second way to get data into struct     
   _ = queryResults.map { row in
       let data = myStruct(value1: row[0]! as! String, value2: row[1] as! String, value3: "", eventDate: row[2] as! String, value4: row[3] as! String)
       tableViewData.append(data)
   }
}
catch let ex {
   print("ReadDB error: \(ex)")
}

Но, если я изменюсьстиль запроса следующий:

do {
   let query = myTable.select(value1, value2, value3, value4).where(identifier == 0)
   guard let queryResults = try? db.prepare(query)
   else {
      print("ERROR")
      return
   }
   //does not work
   for row in queryResults {
      let data = myStruct(value1: row[0] as! String, value2: row[1] as! String, value3: "", eventDate: row[2] as! String, value4: row[3] as! String)
      tableViewData.append(data)
   }
   //neither working   
   _ = queryResults.map { row in
       let data = myStruct(value1: row[0]! as! String, value2: row[1] as! String, value3: "", eventDate: row[2] as! String, value4: row[3] as! String)
       tableViewData.append(data)
   }
}
catch let ex {
   print("ReadDB error: \(ex)")
}

Я получаю эту ошибку:

Невозможно добавить значение типа 'Row' с индексом типа 'Int'

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Это правильный путь

do {
   let query = myTable.select(value1, value2, value3, value4).where(identifier == 0)
   guard let queryResults = try? db.prepare(query)
   else {
      print("ERROR")
      return
   }
   //option 1
   for row in queryResults {
      let data = myStruct(value1: try row.get(value1), value2: try row.get(value2), value3: try row.get(value3), value4: try row.get(value4))
      tableViewData.append(data)
   }
   //option 2  
   _ = queryResults.map { row in
       let data = myStruct(value1: try row.get(value1), value2: try row.get(value2), value3: try row.get(value3), value4: try row.get(value4))
       tableViewData.append(data)
   }
}
catch let ex {
   print("ReadDB error: \(ex)")
}
0 голосов
/ 29 ноября 2018

Из учебника кажется, что что-то вроде

//This is from tutorial

let query = users.select(email)           // SELECT "email" FROM "users"
             .filter(name != nil)     // WHERE "name" IS NOT NULL
             .order(email.desc, name) // ORDER BY "email" DESC, "name"
             .limit(5, offset: 1)     // LIMIT 5 OFFSET 1

Это .select(item) на самом деле сам запрос.Таким образом, всякий раз, когда вы делаете

let query = myTable.select(value1, value2, value3, value4).where(identifier == 0), тогда ЭТО запрос;Вам не нужно ничего готовить для БД.Люди, которые создали эту библиотеку, пытались упростить ее, тогда как вы можете просто сделать .select(item) вместо создания оператора и отправки его в БД.

Используя приведенный выше пример, вы можете видеть, что запрос выбирает электронную почту, где он фильтруется, упорядочивается и ограничивается.Поэтому для вас query - это то, что вы хотите, так как queryResult - я не уверен, что это вернет ... Вы бы запустили результат query на db.prepare(query) ... гм?: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...