2017-12-24 2 views
1

私は迅速なプログラミングを初めて行っています。私はデータに重いアプリケーションを構築しようとしているので、データを格納するためにSqliteを使用することにしました。データベースを作成し、テーブルを作成し、データを挿入し、 "ViewController.swift"であるメインのViewControllerにデータにアクセスすることに成功しました。次に、第2のビューコントローラとそれ自身の "RegisterViewController.swift"を追加しました。最初のビューコントローラーから通常の関数にアクセスしようとしたところ、それはうまくいきました。しかし、ここに来る....私はデータベース関数にアクセスしようとすると、それは私に次のエラーを与える....私は最初のViewコントローラでDBを閉じて、2番目のビューコントローラで再オープンするすべてのオプションを試してみた....何もうまくいくようです...私は専門家の助けが必要です。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 
     } 

    } 

これをテストしていは私の第2のビューコントローラのコードです。 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. 
    } 

エラーメッセージ:NULLデータベース接続ポインタで API呼び出しのクエリが正しく

を実行しませんでした[2b0954060f]

のライン123195で

誤用

+0

ios swiftでswlite3を開始するにはチュートリアルのリンクを教えてください。 – ArgaPK

答えて

1

まず、すべてのデータベース関連のコードをスタンドアロンクラスに入れ、UIViewControllerには入れないことをお勧めします。一般的には、ビューコントローラが大量のView Controller(ビューコントローラのメインジョブの中心ではないコード数で)にならないように、懸念事項を分離することをお勧めします。

エラーは、最初にデータベースを開くことなくgetRecordsCountを呼び出した結果です。

これが役に立ちます。

+0

フィードバックいただきありがとうございます。私はあなたが言ったように正確に行い、それは魅力のように動作します!!本当にありがとう。 – iosappdevguy

+0

@iosappdevguyそれを聞いてうれしい!私の答えを受け入れることができますか?回答を受け入れられたものとしてマークするには、回答の横にあるチェックマークをクリックして、グレー表示から埋め込みに切り替えます。 – MobileWarrior

+0

新しいスタックオーバーフロー:) ..ここでも私の基礎を得る...完了。 – iosappdevguy

関連する問題