即使数据库 FMDB 中有数据,结果集也返回 nil Swift
Result set returning nil even there is data in database FMDB Swift
您好,我正在 swift 项目中使用 FMDB。我将我的 sqite 文件复制到文档目录中并成功。我可以获得复制到文档目录文件夹中的 sqlite 文件。
我像这样将数据插入数据库:
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 Add-One插件)在sqlite文件中看到数据。
现在我想使用以下代码从我的 table 获取所有数据:
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 循环,即使我的数据库中有数据,我也没有获取数据。
每次调用 next() 都会消耗一行。如果您的 table 包含一行,您的 while 循环将看不到它,因为 if 语句会消耗它。
因此将 if results?.next() == true {
替换为 if let results = results {
。这甚至会将 print("results nil")
行变成准确的行。
将现有 Objective-C 代码移植到 Swift 后,考虑使用真正的 Swift SQLite 库:它们将结果集公开为常规集合,处理 Swift 方式,并且更易于使用。参见示例 https://github.com/groue/GRDB.swift#fetching-rows
您好,我正在 swift 项目中使用 FMDB。我将我的 sqite 文件复制到文档目录中并成功。我可以获得复制到文档目录文件夹中的 sqlite 文件。 我像这样将数据插入数据库:
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 Add-One插件)在sqlite文件中看到数据。 现在我想使用以下代码从我的 table 获取所有数据:
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 循环,即使我的数据库中有数据,我也没有获取数据。
每次调用 next() 都会消耗一行。如果您的 table 包含一行,您的 while 循环将看不到它,因为 if 语句会消耗它。
因此将 if results?.next() == true {
替换为 if let results = results {
。这甚至会将 print("results nil")
行变成准确的行。
将现有 Objective-C 代码移植到 Swift 后,考虑使用真正的 Swift SQLite 库:它们将结果集公开为常规集合,处理 Swift 方式,并且更易于使用。参见示例 https://github.com/groue/GRDB.swift#fetching-rows