2016-07-24 50 views
0

你好,我正在使用FMDB到我的swift项目。我将我的sqite文件复制到文档目录并成功。我可以得到复制到文档目录文件夹中的sqlite文件。 我将数据插入到数据库,因为这:结果集返回零甚至有数据库中的数据FMDB Swift

if db.open() { 
    let InsertQry = "insert into profiles (image_url, name,dob,gender) values ('\(imgName)','\(nameTxt.text!)','\(dobTxt.text!)','\(genderTxt.text!)')" 
    print("query= \(InsertQry)") 
    let result = db.executeUpdate(InsertQry, withArgumentsInArray: nil) 
    if !result { 
     print(db.lastErrorMessage()) 
    } 
    else 
    { 
     print("Success") 
    } 
} 

,并将其插入数据成功,我可以看到在使用SQLite经理源码文件数据(Firefox附加一个插件)。 现在我想用这个代码从我的表中的所有数据:

if db.open() { 
    let querySQL = "SELECT * FROM profiles" 

    let results:FMResultSet? = self.db.executeQuery(querySQL,withArgumentsInArray: nil) 
    if results?.next() == true { 
     self.userProfilesArray = NSMutableArray() 
     while results!.next() { 
      let profileInfo = NSMutableDictionary() 
      profileInfo.setObject(results!.stringForColumn("image_url"), forKey: "image_url") 
      profileInfo.setObject(results!.stringForColumn("name"), forKey: "name") 
      profileInfo.setObject(results!.stringForColumn("dob"), forKey: "dob") 
      profileInfo.setObject(results!.stringForColumn("gender"), forKey: "gender") 
      self.userProfilesArray.addObject(profileInfo) 
     } 
    } else { 
     print("results nil") 
     } 
    db.close() 
} 

问题是我进入if results?.next() == true声明,但我不打算while循环,我没有得到数据,即使有数据在我DATABSE。

回答

1

每次调用next()都会占用一行。如果你的表包含一行,你的while循环将不会看到它,因为if语句会消耗它。

因此,用if let results = results {代替if results?.next() == true {。这甚至会将print("results nil")行变成准确的行。

将现有的Objective-C代码移植到Swift之后,考虑使用真正的Swift SQLite库:它们将结果集作为常规集合公开,以Swift方式处理错误,并且更易于使用。参见例如https://github.com/groue/GRDB.swift#fetching-rows