내 xcode 앱을 온라인 데이터베이스에 연결하고 데이터를 가져와 내 앱에 표시하고 내 앱을 사용하여 온라인 데이터베이스에 데이터를 쓰고 싶습니다. 이미 앱을 사용했지만 이제는 오류가 발생합니다.
오류 :
내 웹 페이지에 온라인 데이터베이스가 있고 웹의 파일 관리자에 두 개의 PHP 파일을 업로드했습니다. 내 데이터베이스의 모든 데이터를 검색하고 json으로 인코딩하는 하나의 PHP 파일. 그리고 두 번째 PHP 파일은 내 앱에서 온라인 데이터베이스에 데이터를 쓰는 쿼리를 수행합니다.
위의 그림에서와 같이 json 출력을 성공적으로 얻었지만 데이터를 xcode의 배열로 가져 오려고 할 때 그 오류가 발생합니다.
이것은 내 코드입니다
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableview: UITableView!
@IBOutlet var inputFriendName: UITextField!
@IBOutlet var inputFriendInfo: UITextField!
var data: NSArray = []
override func viewDidLoad() {
super.viewDidLoad()
data = dataOfJson("http://bishanonline.com/extra/serviceselect.php")
println(data)
}
@IBAction func reload() {
data = dataOfJson("http://bishanonline.com/extra/serviceselect.php")
self.tableview.reloadData()
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
func dataOfJson(url: String) -> NSArray {
var data = NSData(contentsOfURL: NSURL(string: url)!)
return (NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: additionInfoCell = self.tableview.dequeueReusableCellWithIdentifier("customCell") as additionInfoCell
var maindata = (data[indexPath.row] as NSDictionary)
cell.friendName!.text = maindata["Name"] as? String
cell.friendInfo!.text = maindata["Additional Info"] as? String
return cell
}
@IBAction func uploadToDatabase() {
var url: NSString = "http://bishanonline.com/extra/servicequery.php?x=\(inputFriendName.text)&y=\(inputFriendInfo.text)"
url = url.stringByReplacingOccurrencesOfString(" ", withString: "%20")
url = url.stringByReplacingOccurrencesOfString("/n", withString: "%0A")
var data = NSData(contentsOfURL: NSURL(string: url)!)
var result = NSString(data: data!, encoding: NSUTF8StringEncoding)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
이 코드 라인에 문제가 있습니다.
func dataOfJson(url: String) -> NSArray {
var data = NSData(contentsOfURL: NSURL(string: url)!)
return (NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray)
}
json 데이터를 배열로 가져 오도록 도와주세요. 도움을 주셔서 감사합니다.
마지막으로 문제가 해결되었습니다. 먼저 정확한 문제를 자세히 설명하고 해결책이 게시됩니다. 당신이하고있는 코드는 완전히 괜찮 았지만 진짜 문제는 당신의 백엔드였습니다.
serviceselect.php의 경우
레코드를 가져 오기 위해 수행 한 코드는 다음과 같습니다.
func dataOfJson(url: String) -> NSArray
{
var data = NSData(contentsOfURL: NSURL(string: url)!)
return (NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray)
}
This above method is returing NSArray but the data you are getting from the server is kinda messed up because along with JSON data some garbage data is included as well.Check out the below image
따라서 위의 문자열에서 JSON 데이터를 생성하려고하면 충돌과 오류가 발생합니다. 무료 호스팅 서비스로 인해이 메시지가 표시 될 수 있습니다 (확실하지 않음).
해결책
func getallrecords(){
let url = NSURL(string: "http://bishanonline.com/extra/serviceselect.php")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
var d = NSString(data: data, encoding: NSUTF8StringEncoding)
var arr = d!.componentsSeparatedByString("<") // spliting the incoming string from "<" operator because before that operator is our required data and storing in array
var dataweneed:NSString = arr[0] as NSString // arr[0] is the data before "<" operator and arr[1] is actually no use for us
if let data = NSJSONSerialization.JSONObjectWithData(dataweneed.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSArray
// JSONObjectWithData는 항상 NSData의 첫 번째 인수를 갖지만 우리의 데이터 는 실제로 NSString이므로 실제로 NSString을 NSData로 변환합니다.
{
for dd in data{
var name : String = dd["Name"]! as String
var info : String = dd["Additional Info"]! as String
println("Name is : \(name)") // MainDeveloper for 0 and BestBuddy for 1 index
println("Info is : \(info)") // Bishan for 0 and AkilaPrabath for 1 index
}
}
}
task.resume()
}
최종 출력
servicequery.php의 경우
func addrecord(x:String,y:String){
let request = NSMutableURLRequest(URL: NSURL(string: "http://bishanonline.com/extra/servicequery.php")!)
var postString : String = "x="+x+"&y="+y
request.HTTPMethod = "GET"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
println("error=\(error)")
return
}
let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
if jsonResult as String == "Successfully added "
{
// Show an alert to notify user
}
}
task.resume()
}
"echo $ query;"도 제거하십시오. servicequery.php의 30 행
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다