2017-09-22 11 views
0

AppleのCloudkitの機能を利用するアプリケーションを構築しました。私が見つけにくいのは、新しい不器用なCouldkitのUIです。大量のデータをロードしたり、既存のレコードを変更することさえ困難です。他の方法でCloudkitにデータをロードすることは可能ですか?たとえば、レコードのCSVファイルをCloudkitにロードする方法はありますか?リモートでCloudkitにデータを読み込む方法

答えて

1

私は、自分のアプリケーションのCloudKitコンテナにFileMakerデータベースのレコードをシード(および更新)します。私のデータソースは.csvではなく.tabファイルですが、同じように動作します。私のプロジェクトでは、私はArtistクラスを持っています。

まず、Xcodeプロジェクトに.csvファイルを追加します。

次に、それを復帰区切りの行配列data.components(separatedBy: "\r")に分割する必要があります。

この配列の各行は、data.components(separatedBy: ",")で区切られている必要があります。私のソースファイルにはカンマが含まれていることが多いので、代わりにタブ("\t")を使用して分割したいと思います。

// [Artist] 
func makeArtistArray(_ fileName: String) -> [Artist] { 

    var array = [Artist]() 

    do { 
     let path = Bundle.main.path(forResource: fileName, ofType: nil) 
     let data = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) 
     let rows = data.components(separatedBy: "\r") 

     // rows.removeAtIndex(0) // if first row contains field names 

     for row in rows { 

      let values = row.components(separatedBy: "\t") 

      let artist = Artist() 

      artist.auctionGroup  = values[0] as CKRecordValue 
      artist.auctionNumber = Int(values[1]) 
      artist.auctionOrder  = Int(values[2])... 

      array.append(artist) 
     } 

    } catch { 
     print(error) 
    } 

    return array 
} 

はその後、私は[CKRecord]配列を作成し、私のコンテナの公共データベースにすべてを保存し関数にその配列を渡します。事前にCKRecordIDを知っている場合は、それを使用して既存のレコードを変更することができます。あなたが渡した場合、存在しない(またはそれを完全に省略)CKRecordIDを、あなたは、新しいレコードを作成します:

// [CKRecord] 
func makeCloudRecords(_ array: [Artist], recordType: String) { 

    var records = [CKRecord]() 

    for artist in array { 

     let recordID = CKRecordID(recordName: "\(artist.name!) - Artist")    
     let record = CKRecord(recordType: recordType, recordID: recordID) 

     record["auctionGroup"] = artist.auctionGroup 
     record["auctionNumber"] = artist.auctionNumber as NSNumber? 
     record["auctionOrder"] = artist.auctionOrder as NSNumber?... 

     records.append(record) 
    } 

    // operation 
    let operation = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: nil) 
    operation.savePolicy = .allKeys 

    operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, operationError in 

     if let error = operationError { 
      // error 
     } 

     if let saved = savedRecords { 
      // print artist.name, or count the array, or whatever..     
     } 
    } 

    database.add(operation) 
} 

はその後、最終的には、makeArtistArray()を呼び出してアプリ内のボタンを設定し、makeCloudRecords()に結果を渡します。

これを行う方法(当時)を学ぶには、正式な文書はなく、多くの試行錯誤が必要でした。しかし、私は今、これらの機能を1年以上使って、定期的に2つのプロダクションアプリを使っています。これが正しい方向に進むことを願っています。

*注意... components(separatedBy:)を呼び出すと文字列が配列されるため、文字列以外の値をキャストすることに注意してください。そうしないと、コンテナのレコードスキーマが不安定になります。

+0

素晴らしい。どうもありがとうございました! – Nick

+0

あなたは大歓迎です! –