2017-12-24 15 views
1

신속한 프로그래밍을 처음 사용합니다. 데이터에 무거운 앱을 만들려고하고 있으므로 Sqlite를 사용하여 데이터를 저장하기로 결정했습니다. 나는 데이터베이스를 생성하고, 테이블을 만들고, 데이터를 삽입하고, "ViewController.swift"인 기본 ViewController에서 데이터에 액세스하는 데 성공했습니다. 그런 다음 두 번째보기 컨트롤러와 자체 "RegisterViewController.swift"를 추가했습니다. 초반에 내 첫 번째보기 컨트롤러에서 일반 기능에 액세스하려고하면 정상적으로 작동합니다. 하지만 .... 데이터베이스 기능에 액세스하려고하면 다음과 같은 오류가 발생합니다 .... 나는 첫 번째 View Controller에서 DB를 닫고 두 번째 View Controller에서 다시 여는 모든 옵션을 시도했습니다 .... 일하는 것처럼 보입니다. 전문가의 도움이 필요합니다.Swift 4 다른보기 컨트롤러에서 데이터베이스 기능에 액세스 할 때 SQLite 문제가 발생합니다.

내가 xCode9.1과 스위프트 4

에이 테스트입니다 것은
import UIKit 
import SQLite3 

class ViewController: UIViewController { 

    var db: OpaquePointer? 
    var gstudentcount: Int = 0 
    var queryCount: Int = 0 
    var id: Int = 0 
    var name: String = "" 
    var grade: Int = 0 

override func viewDidLoad() { 
     super.viewDidLoad() 
     openDatabase() 
     createStudentsTable() 
     getRecordsCount() 
     let gstudentcount = getRecordsCount() 

     if gstudentcount == 0 { 

      performSegue(withIdentifier: "registerVC", sender: self) 

     } 

    func openDatabase() 
    { 

     let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) 
      .appendingPathComponent("database.sqlite") 

     if sqlite3_open(fileURL.path, &db) == SQLITE_OK { 
      print("Database Created !!") 
     } 

    } 

    func createStudentsTable() 
    { 
     if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Students (id INTEGER PRIMARY KEY AUTOINCREMENT, StudentName TEXT, Grade INTEGER)", nil, nil, nil) != SQLITE_OK 
     { 
      let errmsg = String(cString: sqlite3_errmsg(db)!) 
      print("error creating table: \(errmsg)") 
     } else 
     { 
      print("Database Table created") 
     } 

    } 

    func getRecordsCount() -> Int32 
    { 
     //this is our select query 
     let countQuery = "SELECT count(*) FROM Students" 

     //statement pointer 
     var qstmt:OpaquePointer? 

     if sqlite3_prepare(db, countQuery, -1, &qstmt, nil) == SQLITE_OK 
     { 

      if (sqlite3_step(qstmt) == SQLITE_ROW) 

      { 
       let id = sqlite3_column_int(qstmt, 0) 
       print ("printing students count from main view controller \(id)") 
       return id 
      } else 
      { 
      return 99 
      } 

     } else 
     { 
     print ("Query did not execute properly") 
     return 99 
     } 

    } 

여기 내 두 번째 뷰 컨트롤러 코드입니다. RegisterViewController에서

import UIKit 
import SQLite3 


class RegisterViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     let rstudentsCount = ViewController().getRecordsCount() 
     print("this is from RegisterViewController: \(rstudentsCount)") 


     // Do any additional setup after loading the view. 
    } 

오류 메시지 : 라인 123195에서

오용 NULL 데이터베이스 연결 포인터 API 호출은 [2b0954060f]

쿼리가 제대로

을 실행하지 못했습니다
+0

ios swift에서 swlite3를 시작하려면 자습서 링크를 제공해 주시겠습니까? – ArgaPK

답변

1

우선, 모든 데이터베이스 관련 코드를 독립 실행 형 클래스에 넣고 UIViewController에 넣지 않는 것이 좋습니다. 일반적으로보기 컨트롤러가 대규모 뷰 컨트롤러 (보기 컨트롤러의 주요 작업의 중심이 아닌 코드 톤)가되지 않도록 여러 가지 문제를 구분하는 것이 좋습니다.

오류는 데이터베이스를 처음 열지 않고 getRecordsCount를 호출 한 결과입니다.

희망이 도움이됩니다.

+0

의견에 감사드립니다. 나는 네가 말했던 것과 똑같이했다. 그것은 매력처럼 작동한다 !! 무리 감사. – iosappdevguy

+0

@iosappdevguy 듣기 좋다! 내 대답을 받아 들일 수 있니? 답변을 수락 된 것으로 표시하려면 답변 옆에있는 체크 표시를 클릭하여 회색으로 표시된 항목을 채우기로 전환하십시오. " – MobileWarrior

+0

새로운 스택 오버플로 :) .. 내 기본 사항도 여기에서 얻는 중 ... 완료되었습니다. – iosappdevguy