2017-10-25 6 views
0

私のアプリでは、私は各テーブルの何千ものレコードです。私は複数のテーブルの挿入があります。私はfmdbを使用しています。そして、データを挿入するために、私はFMDatabaseQueueを使用しています:私は約15のテーブルに、上記のように、データを挿入していますFMDBデータの挿入時間

DBManager.GetQueue().inTransaction { (db, rollback) in 
     var query: String = String() 

     for obj in chatThreads 
     { 

      query += "insert or replace into \(TABLE_NAME) (\(COLUMN_THREAD_ID), \(COLUMN_CHAT_NAME), \(COLUMN_DATE_TIME)) values (\(obj.threadId), '\(obj.chat_name)', '\(obj.date_time)');" 

     } 

     if !(db.executeStatements(query)) { 

     } 
    } 

。 今、問題は、FMDatabaseQueueは、データを1つずつテーブルに挿入することです。これは、動作する方法です。私は、最初の2つのクラスにデータを挿入しているので、スレッドセーフティのためにFMDatabaseQueueを使用しています。

私の質問は、これを並列プロセスにする方法があるため、同時に異なるテーブルにデータを挿入できることです。そうでない場合は、正しいパスでより良いパフォーマンスを達成するために私に指示してください。 バッチ挿入も試しましたが、同時に複数の挿入を行うとdbロックが発生する可能性があります。

ありがとうございました。

答えて

0

テーブルにデータを挿入する独自のシングルトンクラスとメソッドは、データが挿入されているかどうかを示すbool値を返す必要があります。

データがテーブルに格納されている場合は、データを挿入する別のメソッドを起動できます。テーブルにデータを格納するためのチェーンを作成することが理想的です。 NSObjectの{

//sharedInstance 
static let sharedInstance = LocalDatabase() 



    func methodToCreateDatabase() -> NSURL? { 

    let fileManager = NSFileManager.defaultManager() 

    let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 

    if let documentDirectory:NSURL = urls.first { // No use of as? NSURL because let urls returns array of NSURL 

     // exclude cloud backup 
     do { 
      try documentDirectory.setResourceValue(true, forKey: NSURLIsExcludedFromBackupKey) 
     } catch _{ 
      print("Failed to exclude backup") 
     } 

     // This is where the database should be in the documents directory 
     let finalDatabaseURL = documentDirectory.URLByAppendingPathComponent("contact.db") 

     if finalDatabaseURL.checkResourceIsReachableAndReturnError(nil) { 
      // The file already exists, so just return the URL 
      return finalDatabaseURL 
     } else { 
      // Copy the initial file from the application bundle to the documents directory 
      if let bundleURL = NSBundle.mainBundle().URLForResource("contact", withExtension: "db") { 

       do { 
        try fileManager.copyItemAtURL(bundleURL, toURL: finalDatabaseURL) 
       } catch _ { 
        print("Couldn't copy file to final location!") 
       } 

      } else { 
       print("Couldn't find initial database in the bundle!") 
      } 
     } 
    } else { 
     print("Couldn't get documents directory!") 
    } 

    return nil 
} 

    func methodToInsertUpdateDeleteData(strQuery : String) -> Bool 
    { 

     // print("%@",String(methodToCreateDatabase()!.absoluteString)) 

     let contactDB = FMDatabase(path: String(methodToCreateDatabase()!.absoluteString)) 

     if contactDB.open() { 

      let insertSQL = strQuery 

      let result = contactDB.executeUpdate(insertSQL, 
       withArgumentsInArray: nil) 

      if !result { 
       print("Failed to add contact") 
       print("Error: \(contactDB.lastErrorMessage())") 
       return false 
      } else { 
       print("Contact Added") 
       return true 
      } 
     } else { 
      print("Error: \(contactDB.lastErrorMessage())") 
      return false 
     } 

    } 

    func methodToSelectData(strQuery : String) -> NSMutableArray 
    { 

     let arryToReturn : NSMutableArray = [] 

     print("%@",String(methodToCreateDatabase()!.absoluteString)) 

     let contactDB = FMDatabase(path: String(methodToCreateDatabase()!.absoluteString)) 

     if contactDB.open() { 
      let querySQL = strQuery 

      let results:FMResultSet? = contactDB.executeQuery(querySQL, 
       withArgumentsInArray: nil) 

      while results?.next() == true 
      { 
       arryToReturn.addObject(results!.resultDictionary()) 
      } 

      // NSLog("%@", arryToReturn) 

      if arryToReturn.count == 0 
      { 
       print("Record Not Found") 

      } 
      else 
      { 
       print("Record Found") 

      } 


      contactDB.close() 
     } else { 
      print("Error: \(contactDB.lastErrorMessage())") 
     } 

     return arryToReturn 

    } 

}

そしてこの

if LocalDatabase.sharedInstance.methodToInsertUpdateDeleteData("INSERT INTO CONTACTS_TABLE (name, address, phone) VALUES ('Demo1', 'Demo2', 123)") 
{ 
    NSLog("Store Successfully.") 
} 
else 
{ 
    NSLog("Failled to store in database.") 
} 
のようなあなたのViewControllerから呼び出すメソッド:この

輸入財団 クラスLocalDatabaseよう

シングルトンクラス

これは、ラッパーシングルトンクラス

https://github.com/hasyapanchasara/SQLite_SingleManagerClass

FMDBに接続されています