在 Swift 中使用 FMDB 从多个表中选择



我正在寻找一种方法,在 Swift 中使用 FMDB 从 7 个不同的表中打印出四个特定的列。我尝试使用点符号选择它们,但这似乎不起作用。

数据库如下所示:

  • 艺术家: [艺术家ID], [姓名]
  • 曲目: [曲目 ID], [专辑 ID], [名称]
  • 专辑: [专辑 ID], [
  • 名称], [艺术家 ID]
  • 类型: [类型编号], [名称]
  • 发票: [客户 ID], [发票 ID]
  • 发票行: [发票 ID]
  • 客户: [客户 ID], [名字], [
  • 姓氏], [城市]

.

import Foundation
let database = FMDatabase(path: " /path to database.sqlite/ ")
database.open()
let rs = try database.executeQuery("SELECT Artist.Name, Track.Name, Album.Title, Genre.Name 
                                    FROM Invoice, Customer, InvoiceLine, Track, Album, Artist, Genre
                                    WHERE Customer.FirstName = 'Michelle'
                                    AND Customer.LastName = 'Brooks' 
                                    AND Customer.City = 'New York'
                                    AND Invoice.CustomerId=Customer.CustomerId 
                                    AND InvoiceLine.InvoiceId = Invoice.InvoiceId 
                                    AND Track.TrackId = InvoiceLine.TrackId 
                                    AND Album.AlbumId = Track.AlbumId 
                                    AND Artist.ArtistId = Album.ArtistId
                                    AND Genre.GenreId = Track.GenreId ", values: nil)
while rs.next() {
    let artistName = rs.stringForColumn("Artist.Name")
    let trackName = rs.stringForColumn("Track.Name")
    let albumTitle = rs.stringForColumn("Album.Title")
    let genre = rs.stringForColumn("Genre.Name")
print (artistName + " " + trackName + " " + albumTitle + " " + genre)
}

问题是 stringForColumn(使用 sqlite_column_name ) 函数使用基础表的列的名称,而忽略表的名称。更糟糕的是,如果您有两列同名的列,则无法知道要从哪个表中获取结果。

因此,有两种解决方法:

  1. 您可以为列指定唯一的名称:

    let rs = try database.executeQuery("SELECT Artist.Name AS ArtistName, Track.Name AS TrackName, Album.Title, Genre.Name AS Genre.Name ..."
    

    然后

    let artistName = rs.stringForColumn("ArtistName")
    let trackName = rs.stringForColumn("TrackName")
    let albumTitle = rs.stringForColumn("Title")
    let genre = rs.stringForColumn("GenreName")
    

  2. 使用列号:

    let artistName = rs.stringForColumnIndex(0)
    let trackName = rs.stringForColumnIndex(1)
    let albumTitle = rs.stringForColumnIndex(2)
    let genre = rs.stringForColumnIndex(3)
    

最新更新