Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 3 Вопроса по Data Core 
:(
    Опции темы
cosamia
Дата 8.12.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 11.5.2005

Репутация: нет
Всего: нет



У меня накопились некоторые вопросы по Data Core которые я бы хотел прояснить

1. Разница в архитектуре

К примеру вот код из метода и функции (1 вызывает другой) который я использую для получения данных из БД
Код

-(void)getClientsList
{
    if(![[NSFileManager defaultManager] fileExistsAtPath:[self.database.fileURL path]])
    {
        NSLog(@"database does not exist yet!");
    }
    else if (self.Database.documentState ==UIDocumentStateClosed)
    {
        [self.Database openWithCompletionHandler:^(BOOL success){
            NSLog(@"Open database for fetching...");
            [self fetchDatabaseToGetClients:self.database];
        }];
    }
    else if (self.Database.documentState ==UIDocumentStateNormal)
    {
        NSLog(@"Database is already open...");
        [self fetchDatabaseToGetClients:self.database];
    }
}

-(void)fetchDatabaseToGetClients:(UIManagedDocument *)document
{}




При этом, если этот код у меня находится в контроллере напрямую, то никаких задержек и асинхронизации нет
Т.е. мне не надо использовать ни блоки ни делегаты, чтобы получить данные

Однако, если этот код засунуть в отдельный класс (те у нас будет DAL Layer) и в контроллере вызвать метод этого класса то получаю асинхронизацию и для ее решения надо использовать либо делегаты либо блоки.
Хотелось бы понять почему так? Ведь для метода ViewDidLoad контроллера, где собственно я и получаю данные, это по сути без разницы где находится метод - в том же классе или в отдельном


2. 2 раза открытие базы
Вышепосанный код я использую для остальных таблиц БД (с соответствующим изменением только имени таблицы , сопутствующего класса и тд)
В остальном цепочка действий для Клиента и его покупок идентична: GetSomething -> fetchDataToGetSomething

Однако тут я столкнулся с проблемой:
Если в начале приложение пытается получить список клиентов то эта часть срабатывает нормально
Далее приложение пытается получить список покупок и тут приложение рушится говоря что база уже открыта и я   пытаюсб ее открыть повторно
Это странно тк выше из кода видно что я проверяю состояние базы! И если она не открыта то только тогда я ее открываю
Тем не менее этот подход не работает
В результате метод GetOrders
пришлось переписать оставив в нем лишь 1 строку вызова метода fetch



3 нет результата

Какое-то странное поведение получения данных из базы
Пару дней назад этот функционал работал, на утро перестал
Не могу понять в чем проблема

Задача состоит в получении прайс листа
Используемая таблица ни с чем не связана что упрощает задачу

Вот код для вставки данных :

Код

-(void)useDocumentForInsertIntoDatabase:(DTO*)product
{
    if(![[NSFileManager defaultManager] fileExistsAtPath:[self.Database.fileURL path]])
    {
        [self.Database saveToURL:self.Database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
            [self InsertProduct: stock intoDocument: self.Database];
        }];
    }
    else if (self.Database.documentState ==UIDocumentStateClosed)
    {
        [self.Database openWithCompletionHandler:^(BOOL success){
           [self InsertProduct: product intoDocument: self.Database];
        }];
    }
    else if (self.Database.documentState ==UIDocumentStateNormal)
    {
       [self InsertProduct: product intoDocument: self.Database];
    }
}

-(void)InsertProduct:(DTO*) product intoDocument:(UIManagedDocument *)document
{
    [document.managedObjectContext performBlock:^{
        
 
         NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
         request.predicate = [NSPredicate predicateWithFormat:@"date = %@", product.date];
         NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES];
         request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
         
         NSError *error = nil;
         NSArray *products = [document.managedObjectContext executeFetchRequest:request error:&error];
         
         if (! products || ([products count] > 1)) {
         
             NSLog(@"handle   error");
         }
         else if (![stocks count])
         {
             Product * productE = [NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:document.managedObjectContext];
             productE.date = product.date;
              ...              

             [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
 
         }
 
    }];
}




Судя по Логу вставка осуществляется


А вот далее я пытаюсь получить список 


Код

-(void)fetchDatabaseToGetProducts:(UIManagedDocument *)document
{
 
    [document.managedObjectContext performBlock:^{
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
 
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES];
        request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
        
        NSError *error=nil;
        NSArray *match = [document.managedObjectContext executeFetchRequest:request error:&error];
         
        if([match count]!=0)
        {
        ….

         }//if
        [self.delegate processedSuccess:self.products];
        
    }];
    
    //return array;



И вот тут-то я ничего не получаю…





Это сообщение отредактировал(а) cosamia - 8.12.2012, 18:15
PM   Вверх
Bitter
Дата 8.12.2012, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



А может проще все таки почитать книги?
PM MAIL ICQ Skype   Вверх
cosamia
Дата 8.12.2012, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 11.5.2005

Репутация: нет
Всего: нет



Biitter, если нет желания отвечать то не надо встревать

PM   Вверх
Bitter
Дата 8.12.2012, 20:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



cosamia, если нет желания учиться, то не надо вообще заниматься разработкой под ios
PM MAIL ICQ Skype   Вверх
cosamia
Дата 9.12.2012, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 11.5.2005

Репутация: нет
Всего: нет



Цитата(Bitter @ 8.12.2012,  20:04)
cosamia, если нет желания учиться, то не надо вообще заниматься разработкой под ios

bitter, если это все что есть сказать, то не надо на форум ходить пальцы гнуть
PM   Вверх
Maksys
Дата 10.12.2012, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Future Splasher
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 15.6.2005
Где: Екатеринбург

Репутация: нет
Всего: 17



Как то все не правильно процентов на 90%....
Чтоб проверить была ли вставка я юзаю sqlite3. 
По коду не ясно ни чего :( поддерживаю Bitter надо почитать CoreData.


--------------------
 С уважением, BiMaWa™©.
user posted image
user posted image
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | iOS | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.