Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Не сохраняются данные в базе sqlLite (Core Data)

Создал приложение .
При запуске приложения создаются таблицы в соотвествии с моделью, но данные не сохраняются.
Как я понял данные должны сохраняться при выполнении кода:

Код

[context save:&error];


но этого не происходит.
Почему? И как исправить?
В директории приложения кроме файла БД также создаются 2 файла:
.slite-shm и .slite-wal.
Как отключить создание этих файлов и писать в файл базы напрямую используя CoreData?
Ответ:


Код

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
  if (_persistentStoreCoordinator != nil) {
    return _persistentStoreCoordinator;
  }
  
  NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myDB.sqlite"];
  
  NSError *error = nil;
  _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
  
  NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} }; // ***
  if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
    
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
  }
  
  return _persistentStoreCoordinator;
}


Это сообщение отредактировал(а) TechnoMag - 3.10.2014, 11:41
Вопрос: Муки выбора: core data или работа "напрямую" с sqlite

Здравствуйте! Я новичок в разработке под osx и ios, но так как база на сях и плюсах была (когда-то давно), то идет это дело у меня довольно быстро. И пару дней назад передо мной встал следующий вопрос:

Ситуация: на iOS устройстве (пусть это будет фронтенд) требуется хранить (и периодически обновлять без обновления самого приложения) с сервера достаточно большое количество данных (тексты, картинки, некоторые служебные данные). На бэкенде (сервере) это все представлено обычной MySql базой данных с большим количеством таблиц и связей, и встала задача представить то же самое на iOS устройстве. При этом требуется сделать так, чтобы программа на устройство устанавливалась уже с начальным набором данных и дальше, по желанию пользователя, обновлялась с сервера. Основной режим работы приложения - оффлайн. Важно, что пользователь сам данные менять не может, т.е. все таблицы readonly и это, вроде бы, позволяет снять вопросы целостности связей, но мне непривычен такой подход.

Вопрос: что лучше использовать для хранения данных на устройстве, core data или прямую работу с SQLite базой? Прочитав несколько статей (в т.ч. большой кусок core data programming guide) я понял, что не могу принять решение по следующим причинам:
1: я привык работать с "нормальными" базами, где есть ключи, связи, индексы, уникальные значения итд и "нормальными" запросами к бд. В core data я половину из этого не нашел;
2: у самих apple написано "Core Data is not a relational database..." со всеми вытекающими. Насколько "надежно" доверять такой системе, если надо хранить не просто master-detail список покупок с соответствующим представлением в бд? Тут еще раз всплывает вопрос о том, что все таблицы readonly и, по идее, можно вообще наплевать на связи и положиться на логику сервера (что там все таблицы правильные и при обновлениях ничего не "перекосит").
3: процесс начального заполнения до конца неясен (программа должна устанавливаться с изначальным набором данных): сам механизм core data не позволяет подключить созданную и заполненную заранее базу SQLite. Как я понял, выходом тут является создать OSX приложение с core data, создать там пустую модель, заполнить ее данными и закинуть в iOS проект. Но тут мне вообще пока неясно, как совместить структуру на сервере (где есть ссылочная целостность, уники и тд, уже писал выше) и полученный SQLite файл со структурой, которую core data посчитает нужной (конечно, на основе моей схемы, но тем не менее).

На данный момент мне, конечно же, проще будет работать напрямую с SQLite (несмотря на то, что Apple обещает снижение количества кода на 50-70% при использовании КД), но, так как в принципе эта сфера мне нова, мне не хочется беспричинно пользоваться нерекомендуемыми (устаревшими?) технологиями. Поэтому прошу совета опытных в этой сфере людей.

И еще общий вопрос: на одном буржуйском форуме я запомнил фразу, что CoreData для OSX существенно отличается (по логике, не по коду) от CoreData для IOS, но дальнейшего развития эта фраза не получила. Объясните, пожалуйста, что имелось ввиду.
Ответ: Вчера обновились требования к программе, и, видимо, прийдется отказаться от Core Data в пользу SQLite: хоть я и всячески пытался избежать возникновения такой ситуации, но выбора нет: в процессе работы требуется изменять структуру бд (добавлять новые таблицы и связи) без обновления самой программы, чего, как я понял, Core Data не умеет. Значит, буду использовать fmdb, еще раз спасибо за статью и ресурс!
Вопрос: Core Data проверка уникальности записи

Добрый вечер! Вливаюсь в CoreData потихоньку, почти все понятно, кроме вот чего: не могу до конца понять, как работает проверка данных.

Пример: есть таблица (справочник) Colors, в которой одно поле - color (string). Данные в этом поле должны быть уникальны. Во время проектирования модели (xcdatamodel) возможности задать такого свойства нет (пришлось смириться с этим). Ок, тогда создаю класс Colors : NSManagedObject со свойством color, и там же метод
Код Objective-C
1
- (BOOL)validateColor:(id *)color error:(NSError **)outError
. Затем мне надо, вроде бы, просто выполнить запрос, который вернет количество записей с соответствующим color, но меня тут клинит (возможно, надо просто отдохнуть). Правильный ли это подход или это делается как-то по-другому?
Ответ: есть два имеющих вполне одинаковое право на существование подхода
это грубо говоря толстая и тонкая модели

Например в шаблоне Active Record модель сама умеет делать операции присущие DAL (Data Access Layer)
А в шаблоне Repository - вся DAL логика выносится в так званные репозитории и там производятся всякие CRUD операции над моделями, в то время модель это просто объект с полями и, возможно, еще каким-то описанием, не более.

Вы сейчас описываете Active Record, есть крутой фреймворк для реализации CRUD операций над моделями именно таким образом

Просто в Xcode, если вы заново сгенерируете NSManagedObject файл из xcdatamodel, то он просто перезатрет все, что у вас там было еще написано
Потому либо создавайте категорию для модели, либо продвигайтесь по Repository пути и в репозиториях реализовывайте такую логику, либо гляньте такую чудо-тулзовинку и в human-моделях описывайте дополнительную логику

А насчет проверки на уникальность - то да, проверяете или такая запись есть и если есть, то увы
Вопрос: Improve Core Data skills

Привет всем.

Как-то так печально у меня складывался рабочий опыт, что с CoreData особо проектов и не было. А если и было (две штуки), то в одном уже все было запилено до меня, а в другом юзался Magical Record, да и то, структура была минимальной.
А хочется быть готовым к потенциальному Проекту, где CoreData будет монументально возвышаться и требовать от меня умений ее готовить.

Кто-то может порекомендовать литературу о проектировании структуры CoreData? Чтобы научиться аргументированно планировать сущности в ней, что с чем стоит объединять, что лучше вынести отдельно и т.д. ..
Может стоит почитать просто что-то SQL-ориентированное, благо такой литературы полно?

А то во всех книжках по CoreData, что я находил, преимущественно все одно и то же: описание Object/Context/Model - fetch/fetchResultController - миграция/многопоточность.
А именно о проектировании ничего найти не могу((

Вдруг кто-то может что посоветовать.
Ответ: Melzas, CoreData под капотом - граф. Разберитесь немножко в тематике, потом пишите.
А то понапишут несуразностей, потом в соседней ветке вопросы странные. Начнете нормальные формы использовать "вручную" рассматривая sqlite файл - у вас такое падение производительности будет - ахните.
Любую книгу по CoreData открываем и видим что она 5 форм практически из коробки поддерживает.
Но для должного спользования CoreData нужно разбираться что такое графы и деревья.

Сообщение от Melzas
"проектирование модели Core Data" == "проектирование БД SQL".
Проектирование модели CoreData это всего лишь создание зависимостей между объектами. На гораздо более высоком уровне. А так как SQLite это всего лишь возможный вариант хранения данных - ваше утверждение неверно даже с двумя знаками '='.
Вопрос: Отбор записей по скрытому полю - relationship

В таблице Warehouses, Core Data создается поле (FK) - ZCityToWarehouse - это relationship в модели данных, которое не генерируется в классе NSManagedObject.
Мне нужно выбрать записи по этому полю.
На этапе выполнения выдается ошибка: "keypath not found in entity"

Код

  NSEntityDescription *entity = [NSEntityDescription
                                 entityForName:@"Warehouses" inManagedObjectContext:managedObjectContext];
  
  [fetchRequest setEntity:entity];
  
  NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                      initWithKey:@"whName" ascending:YES];
  NSArray* sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
  
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Warehouses.zcitytowareouse == 133"];
 // ....

Ответ:
В таблице Warehouses, Core Data создается поле (FK) - ZCityToWarehouse - это relationship в модели данных, которое не генерируется в классе NSManagedObject.
Мне нужно выбрать записи по этому полю.
На этапе выполнения выдается ошибка: "keypath not found in entity"

Код

  NSEntityDescription *entity = [NSEntityDescription
                                 entityForName:@"Warehouses" inManagedObjectContext:managedObjectContext];
  
  [fetchRequest setEntity:entity];
  
  NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                      initWithKey:@"whName" ascending:YES];
  NSArray* sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
  
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Warehouses.zcitytowareouse == 133"];
 // ....

Вопрос: Пропали данные при обновлении версии программы на

При обновлении приложения из iTunes Store данные веденные в программу пропали.
Причем и данные в программу не вводятся. Какая то проблема с правом доступа.
Удаляю программу и устанавливаю ее снова. Данные можно вводить. Все работает.
Кто сталкивался с такой ситуацией при написании своих программ?
Ответ:
Ничего не менял в базе данных и не менял каталоги.
Вопрос: Синнхронизация приложения с базой данных

Как синхронизировать приложение для Iphone, с базой данных? на чем вообще написать это можно? ( с учетом, что само приложение не будет особо сложным, обычной каталог, информация для которого лежит в базе данных)
Ответ: Parse должно хватить.
Вопрос: Отображение большого количества данных

Здравствуйте. Подскажите как реализовать показ данных из json? Нужно вывести разные данные, картинка, большой текст и короткую информацию. Все данные должны быть редактируемые (ну кроме картинки). Я хочу сделать вывод в tableView, для каждого типа данных создать свой вариант кастомной ячейки (для большого текста textView, для короткой информации textField, для картинки просто картинка большая), но проблема в том как узнать какой это тип данных и какую ячейку использовать? Я не могу придумать по какому признаку делать проверку? Или может быть у кого то есть способ вывода данных по лучше. Загвоздка в том что короткой информации много и эти ячейки нужно создавать программно.

Добавлено через 8 часов 13 минут
Для примера, есть дикшинари с характеристиками машины. В detail отображается картинка машины и ее характеристики цвет, пробег, марка, модель, год выпуска и тд. Вот когда этих характеристик не много, то можно воспользоваться статическими ячейками, но когда таких характеристик много например 20, то в сториборде создавать такие ячейки довольно муторно, особенно если через время нужно чуть-чуть изменить дизайн этих ячеек. Если использовать динамическую таблицу то как программно создавать эти ячейки я не представляю. В ячейке должно быть label и textField. В label будет текст характеристики (напр. "цвет" или "цена"), а в textField значение этой характеристики (белый, красный). И как тогда производить вывод если в каждой ячейке разные данные (в первой цвет, во второй цена). Может есть какие то примеры?
Ответ: Да нет, я пробовал разные способы. И доставать из дикшинари ключи, а потом ключи выводить в label, а Value в textField все отлично если бы не картинка и textView. Потому как если закинуть картинку и textView на view, а значения выводить в табличку, то тогда не срабатывает скролл который бы прокручивал всю вьюшку, а не только tableView. И создать для каждой картинки свой идентификатор, но как узнать когда какой идентификатор нужно использовать?
Вопрос: Передача данных по TCP IP (Socket) от устройства к девайсу по вайфай

Ищу человека который разбираеться в передаче данных по сокету для iOs устройств , либо очет научиться в этом разбираться
Для Android уже такая программа мною создана , работает.Исходники могу предоставить

Язык любой objectiv-c swift , c# с xamarin даже будет в приоритете.


требуется человек , который может удалённо зайти на mac(по тимвьюверу) и отладить весь процесс.Доработка готового.Требуется специалист. Либо который хочет разобраться в процессе работы с сетью и передачей.


.Обращаться в Skype : Soprano6111.

Пример из android (строка) ->

//блок запроса , проверка связи 1

(есть реализация как отправки строк ,так и байт)
transceiver – в классе созданы функции открытия порта и передачи + приёма

transceiver.send_TCP_string("Q" + QC.get_next_number() + "," + transceiver.Q_KA);
//внутри это функции создали сокет в классе Transceiver и описали отправку строки с параметрами на устройство

String answerConnect = transceiver.read_TCP_string(); //сюда приходит ответ


answerConnect – строку выводим на главный экран в виде текста после того как получили // например там будет состояние переключателя .

можно по байтам ->

int bytesreaded = transceiver.send_query(wifi.getDeviceIP(), tx_buf, 1, 100); // отправляем запрос
if (bytesreaded > 0) { // если ответ больше нуля то ->
transceiver.get_rx_buf(rx_buf); // смотрим в буфер что пришло
объект.state = rx_buf[50]; // записываем один из байтов в объект которые в последствии //транслируем на дисплей

СУТЬ КРАТКО :
Нужно приложение которое передаёт по сокету строку – > устройство присылает ответ , нужно написать класс с функциями приёма и передачи строки и соответственно сделать интерфейс на пример у нас есть ползунок – при здвиге – мы отправляем команду на устройство включить реле разетки , при повторном сздвиге – посылаем команду на отключение. пока нужно пробный макет с 1ним элементом и 1но командой. далее уже надо будет усложнять.Я так понимаю вроде у SDK есть клас работы с сокетами Network ? вы на чём пишите на objectiv-c или swift?

.Обращаться в Skype : Soprano6111.
Ответ: ап1
Вопрос: CoreData: как сохранить только одну entity из множества созданных

Добрый день!
Не могу разобраться, как сделать вот что:

При работе приложения на разных этапах создается несколько сущностей (entities), которые, в конце концов, "вкладываются" одна в другую в порядке, обратном созданию. Пример:

Есть сущности A, B, C Все наследуются от NSManagedObject. Все они добавляются в NSManagedObjectContext, созданный в AppDelegate (по эппловским мануалам).

Как оно должно работать:
Сущность A содержит сущность B, B содержит C (в sql это были бы foreign keys, а как корректно в стиле core data сказать - не могу придумать). По ходу выполнения программы сначала создается, но не сохраняется, A, потом также создается B, потом С. После создания C, С сохраняется, добавляется в B, B сохраняется, добавляется в A и после этого A сохраняется.

Но при попытке сохранить C сразу же происходит попытка сохранения A и B, чего мне не нужно (реальные сущности на этом этапе не заполнены необходимыми данными). Я пробовал для каждой сущности создавать отдельный NSManagedObjectContext, но в этом случае я не могу добавить одну сущность в другую - выдается ошибка, что сущности в разных контекстах не могут ссылаться друг на друга (или что-то типа того).

Ни в appcoda, raywenderlich я подобных примеров не нашел. Направьте на путь истинный ) Спасибо!
Ответ: матчасть

[ENG] описание синхронной работы с несколькими контекстами дочерние паралельные и тп