-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCoreDataManager.m
111 lines (90 loc) · 4.03 KB
/
CoreDataManager.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
// MyClass.m
// projectoListaClientes
//
// Created by Tiago Sousa on 13/05/2011.
// Copyright 2011 ArquiConsult. All rights reserved.
//
#import "GlobalVariables.h"
@implementation CoreDataManager
@synthesize managedObjectContext;
@synthesize fileName;
//inicializacao com nome de ficheiro especificado
/* DESIGNATED INITIALIZER */
-(id)initWithFileName: (NSString *) file
{
if((self = [super init]))
{
[self setFileName:file];
}
return self;
}
//inicializacao por defeito
-(id)init
{
return [self initWithFileName:@"BD_Clientes.sqlite"];
}
- (NSManagedObjectContext * ) getManagedObjectContext
{
//Se nao existir uma instancia do objecto, criar uma
if ( nil == managedObjectContext )
{
//Obter os caminhos das directorias para os documentos desta aplicaçao
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//Retirar o primeiro (principal)
NSString *pathBase = (paths.count > 0) ? [paths objectAtIndex:0] : nil;
//Construir o caminho inteiro ( URL : caminho da pasta + ficheiro.extensao)
NSURL *fileURL = [NSURL fileURLWithPath: [pathBase stringByAppendingPathComponent:fileName]];
//Criar uma PersistantStoreCoordinator para gerir as PersistantStores (no nosso caso é só a nossa BD de SQLite)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
//Objecto que receberá o eventual erro ao adicionar uma PersistantStore à instancia psc
NSError *errorOpen;
//Adicionar a PersistantStore com o URL que construimos há pouco, do tipo SQLiteStore
if(nil == [psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:fileURL
options:nil
error:&errorOpen])
{
//O retorno da funçao é a PersistantStore adicionada. Se for nil, houve erro e vamos escreve-lo para a consola
/* O CONTROLO DESTE ERRO DEVE SER MUDADO: POR AGORA SÓ EXISTE UMA NOTIFICAÇAO, MAS ESTE ERRO DEVE SER DEVIDAMENTE TRATADO */
NSLog(@"Unable to load %@",fileName);
NSLog(@"Error: %@", errorOpen);
}
//Construir o objecto ManagedOjectContext e definir a PersistantStoreCoordinator como a instancia psc
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:psc];
//Gestao de memória
[psc release];
[errorOpen release];
[fileURL release];
[pathBase release];
[paths release];
}
//Retornar o objecto (método "get")
return managedObjectContext;
}
- (NSArray *) fetchEntitys: (NSEntityDescription *)entityDescription WithPredicate: (NSPredicate *)predicate AndSortBy: (NSArray *)sortDescriptors
{
NSManagedObjectContext *moc = [self managedObjectContext];
//NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc];
//NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
[request setPredicate:predicate];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptors]];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
if (results == nil)
{
/* O CONTROLO DESTE ERRO DEVE SER MUDADO: POR AGORA SÓ EXISTE UMA NOTIFICAÇAO, MAS ESTE ERRO DEVE SER DEVIDAMENTE TRATADO */
NSLog(@"Unable to perform fetch!");
NSLog(@"Error: %@", error);
}
//Gestao de Memória
[moc release];
[request release];
[results autorelease];
return results;
}
@end