iOS.数据持久化.PersistenceLayer.对象归档

#import <Foundation/Foundation.h>
#import "Persistence02Note.h"

#define FILE_NAME @"Persistence02NotesList.archive"
#define ARCHIVE_KEY @"Persistence02NotesList"

@interface Persistence02NoteDAO : NSObject

+ (Persistence02NoteDAO*)sharedManager;

- (NSString *)applicationDocumentsDirectoryFile;
- (void)createEditableCopyOfDatabaseIfNeeded;

//插入Persistence02Note方法
-(int) create:(Persistence02Note*)model;

//删除Persistence02Note方法
-(int) remove:(Persistence02Note*)model;

//修改Persistence02Note方法
-(int) modify:(Persistence02Note*)model;

//查询所有数据方法
-(NSMutableArray*) findAll;

//按照主键查询数据方法
-(Persistence02Note*) findById:(Persistence02Note*)model;

@end

 

#import "Persistence02NoteDAO.h"

@implementation Persistence02NoteDAO


static Persistence02NoteDAO *sharedManager = nil;

+ (Persistence02NoteDAO*)sharedManager
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{        
        
        sharedManager = [[self alloc] init];
        [sharedManager createEditableCopyOfDatabaseIfNeeded];               
    });
    return sharedManager;
}


- (void)createEditableCopyOfDatabaseIfNeeded {
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *writableDBPath = [self applicationDocumentsDirectoryFile];
    
    BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath];
    if (!dbexits) {
        
        NSString *path = [self applicationDocumentsDirectoryFile];
        
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        
        NSDate *date1 = [dateFormatter dateFromString:@"2010-08-04 16:01:03"];
        Persistence02Note* Persistence02Note1 = [[Persistence02Note alloc] init];
        Persistence02Note1.date = date1;
        Persistence02Note1.content = @"Welcome to MyPersistence02Note.";
        
        NSDate *date2 = [dateFormatter dateFromString:@"2011-12-04 16:01:03"];
        Persistence02Note* Persistence02Note2 = [[Persistence02Note alloc] init];
        Persistence02Note2.date = date2;
        Persistence02Note2.content = @"欢迎使用MyPersistence02Note。";
        
        NSMutableArray* array  = [[NSMutableArray alloc] init];

        
        [array addObject:Persistence02Note1];
        [array addObject:Persistence02Note2];
        
        NSMutableData * theData = [NSMutableData data];
        NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]
                                      initForWritingWithMutableData:theData];
        [archiver encodeObject:array forKey:ARCHIVE_KEY];
        [archiver finishEncoding];
        
        [theData writeToFile:path atomically:YES];
    }
}

- (NSString *)applicationDocumentsDirectoryFile {
    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [documentDirectory stringByAppendingPathComponent:FILE_NAME];
    return path;
}


//插入Persistence02Note方法
-(int) create:(Persistence02Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [self findAll];
    
    [array addObject:model];    
    
    NSMutableData * theData = [NSMutableData data];
    NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]
                                  initForWritingWithMutableData:theData];
    [archiver encodeObject:array forKey:ARCHIVE_KEY];
    [archiver finishEncoding];
    [theData writeToFile:path atomically:YES];
    
    return 0;
}

//删除Persistence02Note方法
-(int) remove:(Persistence02Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [self findAll];
    
    for (Persistence02Note* Persistence02Note in array) {
        
        //比较日期主键是否相等
        if ([Persistence02Note.date isEqualToDate:model.date]){
            [array removeObject: Persistence02Note];
            
            NSMutableData * theData = [NSMutableData data];
            NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]
                                          initForWritingWithMutableData:theData];
            [archiver encodeObject:array forKey:ARCHIVE_KEY];
            [archiver finishEncoding];
            [theData writeToFile:path atomically:YES];
            
            break;
        }
    }
    
    return 0;
}

//修改Persistence02Note方法
-(int) modify:(Persistence02Note*)model
{
    
    NSString *path = [self applicationDocumentsDirectoryFile];
    NSMutableArray *array = [self findAll];
    
    for (Persistence02Note* Persistence02Note in array) {
        
        //比较日期主键是否相等
        if ([Persistence02Note.date isEqualToDate:model.date]){
            
            Persistence02Note.content = model.content;
            
            NSMutableData * theData = [NSMutableData data];
            NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]
                                          initForWritingWithMutableData:theData];            
            [archiver encodeObject:array forKey:ARCHIVE_KEY];
            [archiver finishEncoding];
            
            [theData writeToFile:path atomically:YES];
            
            break;
        }
    }
    return 0;
}

//查询所有数据方法
-(NSMutableArray*) findAll
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    
    NSMutableArray *listData = [[NSMutableArray alloc] init];
    NSData * theData =[NSData dataWithContentsOfFile:path];
    
    if([theData length] > 0) {
        NSKeyedUnarchiver * archiver = [[NSKeyedUnarchiver alloc]
                                        initForReadingWithData:theData];
        listData = [archiver decodeObjectForKey:ARCHIVE_KEY];
        [archiver finishDecoding];

    }
    return listData;
}

//按照主键查询数据方法
-(Persistence02Note*) findById:(Persistence02Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    
    NSMutableArray *listData = [[NSMutableArray alloc] init];
    NSData * theData =[NSData dataWithContentsOfFile:path];
    
    if([theData length] > 0) {
        NSKeyedUnarchiver * archiver = [[NSKeyedUnarchiver alloc]
                                        initForReadingWithData:theData];
        listData = [archiver decodeObjectForKey:ARCHIVE_KEY];
        [archiver finishDecoding];
        
        for (Persistence02Note* Persistence02Note in listData) {
            
            //比较日期主键是否相等
            if ([Persistence02Note.date isEqualToDate:model.date]){
                return Persistence02Note;
            }
        }
    }
    return nil;
}


@end

 

posted @ 2014-06-18 01:55  so_tm_what  阅读(221)  评论(0)    收藏  举报