AppleのCloudkitの機能を利用するアプリケーションを構築しました。私が見つけにくいのは、新しい不器用なCouldkitのUIです。大量のデータをロードしたり、既存のレコードを変更することさえ困難です。他の方法でCloudkitにデータをロードすることは可能ですか?たとえば、レコードのCSVファイルをCloudkitにロードする方法はありますか?リモートでCloudkitにデータを読み込む方法
答えて
私は、自分のアプリケーションの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:)
を呼び出すと文字列が配列されるため、文字列以外の値をキャストすることに注意してください。そうしないと、コンテナのレコードスキーマが不安定になります。
素晴らしい。どうもありがとうございました! – Nick
あなたは大歓迎です! –