Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > 3 Вопроса по Data Core


Автор: cosamia 8.12.2012, 18:13
У меня накопились некоторые вопросы по 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;
} 


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




Автор: Bitter 8.12.2012, 18:51
А может проще все таки почитать книги?

Автор: cosamia 8.12.2012, 19:21
Biitter, если нет желания отвечать то не надо встревать

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

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

bitter, если это все что есть сказать, то не надо на форум ходить пальцы гнуть

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)