Cloudant не сохраняет данные объектов, отправленные через Bluemix Data для iOS 8.

Я пытаюсь сохранить простой объект (пользовательский класс с двумя свойствами String) в базе данных Cloudant из приложения iOS. Я использую Bluemix iOS SDK, в частности «Данные для iOS 8». Пока что я пытаюсь применить примеры для языка программирования Swift из документации IBM Bluemix.

Код для хранения объекта взят из руководств и был лишь слегка адаптирован, если вообще был адаптирован. Приведенный ниже код содержится в функции, которая вызывается при редактировании текстового поля.

var remoteStore:CDTStore!

    // initialize an instance of the IMFDataManager
    let manager:IMFDataManager = IMFDataManager.sharedInstance()
    let name = "pricingdb"

    var testData = TestData(firstName: "aaaa", lastName: "bbbbb")

    // Create remote store
    manager.remoteStore(name, completionHandler: { (createdStore:CDTStore!, error:NSError!) -> Void in
        if nil != error {
            //Handle error
        } else {
            remoteStore = createdStore
            println("Successfully created store: \(remoteStore.name)")
            // Register class with remote store
            remoteStore.mapper.setDataType("TestData", forClassName: NSStringFromClass(TestData.classForCoder()))

            // Actually save the object to Bluemix
            remoteStore.save(testData, completionHandler: { (savedObject:AnyObject!, error:NSError!) -> Void in
                if nil != error {
                    //Save was not successful, handler received an error
                    println("Error: \(error)")
                } else {
                    // Use the result
                    println("Saved revision: \(savedObject)")
                }
            })
        }
    })

База данных Cloudant, которую я хочу сохранить, уже существует. Я могу подключиться к хранилищу данных, и объект также сохраняется, вывод консоли:

HTTP_Status: 201
JSON Body: {
    id = 6dfde55449915faa92c471bd0ecd89d6;
    ok = 1;
    rev = "1-419dfa2a14026c4c18545723e8f990fa";
}
Saved revision: <pricingtester.TestData: 0x7f91f1c6e2f0>

Однако, глядя на тело JSON выше, я ожидаю увидеть там данные объекта, и даже если они не будут/не должны отображаться там, я ожидаю увидеть их в созданной записи базы данных. Но соответствующая запись в базе данных при проверке панели управления Cloudant выглядит следующим образом:

{
  "_id": "6dfde55449915faa92c471bd0ecd89d6",
  "_rev": "1-419dfa2a14026c4c18545723e8f990fa",
  "@datatype": "TestData"
}

Что я мог упустить?

Возник связанный с этим вопрос: в приведенном выше коде всегда создается хранилище. Если он существует, он не воссоздается, а создается ссылка на это хранилище. Если я знаю, что магазин существует, а он существует, как я могу получить ссылку на этот магазин, не пытаясь сначала его создать?


person esmith    schedule 18.05.2015    source источник
comment
Эй, было бы полезно, если бы вы могли показать нам здесь некоторый контекст кода. Что-то явно было написано, но тело пусто, за исключением поля @datatype, которое является отличительной чертой картографа объектов/документов. Рад взглянуть на ваш код, если вы можете поделиться им.   -  person xpqz    schedule 19.05.2015
comment
Спасибо, что посмотрели. Я добавил код и надеюсь, что он поможет вам.   -  person esmith    schedule 21.05.2015


Ответы (1)


Можете ли вы предоставить исходный код класса TestData? Для быстрых классов String в настоящее время должен использовать NSString (ObjC) вместо Swift String (например, var make:NSString)

person Kevan Holdaway    schedule 26.05.2015
comment
Да это оно! Моими свойствами были строки (например, var make:String). После использования NSString все элементы были аккуратно записаны в базу данных Cloudant. В документации указано, что необходимо использовать NSString (или NSDate), но мне было легко это не заметить... - person esmith; 27.05.2015