zoukankan      html  css  js  c++  java
  • iOS.数据持久化.PersistenceLayer.SQLite

    #import <Foundation/Foundation.h>
    #import "Persistence03Note.h"
    #import "sqlite3.h"
    
    #define DBFILE_NAME @"Persistence03NotesList.sqlite3"
    
    
    @interface Persistence03NoteDAO : NSObject
    {
        sqlite3 *db;
    }
    
    + (Persistence03NoteDAO*)sharedManager;
    
    - (NSString *)applicationDocumentsDirectoryFile;
    - (void)createEditableCopyOfDatabaseIfNeeded;
    
    
    //插入Persistence03Note方法
    -(int) create:(Persistence03Note*)model;
    
    //删除Persistence03Note方法
    -(int) remove:(Persistence03Note*)model;
    
    //修改Persistence03Note方法
    -(int) modify:(Persistence03Note*)model;
    
    //查询所有数据方法
    -(NSMutableArray*) findAll;
    
    //按照主键查询数据方法
    -(Persistence03Note*) findById:(Persistence03Note*)model;
    
    @end
    #import "Persistence03NoteDAO.h"
    
    @implementation Persistence03NoteDAO
    
    
    static Persistence03NoteDAO *sharedManager = nil;
    
    + (Persistence03NoteDAO*)sharedManager
    {
        static dispatch_once_t once;
        dispatch_once(&once, ^{
            
            sharedManager = [[self alloc] init];
            [sharedManager createEditableCopyOfDatabaseIfNeeded];
            
            
        });
        return sharedManager;
    }
    
    
    - (void)createEditableCopyOfDatabaseIfNeeded {
        
        NSString *writableDBPath = [self applicationDocumentsDirectoryFile];
        
        if (sqlite3_open([writableDBPath UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(NO,@"数据库打开失败。");
        } else {
            char *err;
            NSString *createSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS Persistence03Note (cdate TEXT PRIMARY KEY, content TEXT);"];
            if (sqlite3_exec(db,[createSQL UTF8String],NULL,NULL,&err) != SQLITE_OK) {
                sqlite3_close(db);
                NSAssert1(NO, @"建表失败, %s", err);
            }
            sqlite3_close(db);
        }
    }
    
    - (NSString *)applicationDocumentsDirectoryFile {
        NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *path = [documentDirectory stringByAppendingPathComponent:DBFILE_NAME];
        
        return path;
    }
    
    
    //插入Persistence03Note方法
    -(int) create:(Persistence03Note*)model
    {
        
        NSString *path = [self applicationDocumentsDirectoryFile];
        
        if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(NO,@"数据库打开失败。");
        } else {
            
            NSString *sqlStr = @"INSERT OR REPLACE INTO Persistence03Note (cdate, content) VALUES (?,?)";
            
            sqlite3_stmt *statement;
            //预处理过程
            if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement, NULL) == SQLITE_OK) {
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                NSString *nsdate = [dateFormatter stringFromDate:model.date];
                
                //绑定参数开始
                sqlite3_bind_text(statement, 1, [nsdate UTF8String], -1, NULL);
                sqlite3_bind_text(statement, 2, [model.content UTF8String], -1, NULL);
                
                //执行插入
                if (sqlite3_step(statement) != SQLITE_DONE) {
                    NSAssert(NO, @"插入数据失败。");
                }
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
        
        return 0;
    }
    
    //删除Persistence03Note方法
    -(int) remove:(Persistence03Note*)model
    {
        NSString *path = [self applicationDocumentsDirectoryFile];
        
        if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(NO,@"数据库打开失败。");
        } else {
            
            NSString *sqlStr = @"DELETE  from Persistence03Note where cdate =?";
            
            sqlite3_stmt *statement;
            //预处理过程
            if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement, NULL) == SQLITE_OK) {
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                NSString *nsdate = [dateFormatter stringFromDate:model.date];
                
                //绑定参数开始
                sqlite3_bind_text(statement, 1, [nsdate UTF8String], -1, NULL);
                //执行
                if (sqlite3_step(statement) != SQLITE_DONE) {
                    NSAssert(NO, @"删除数据失败。");
                }
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
        
        return 0;
    }
    
    //修改Persistence03Note方法
    -(int) modify:(Persistence03Note*)model
    {
        
        NSString *path = [self applicationDocumentsDirectoryFile];
        
        if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(NO,@"数据库打开失败。");
        } else {
            
            NSString *sqlStr = @"UPDATE Persistence03Note set content=? where cdate =?";
            
            sqlite3_stmt *statement;
            //预处理过程
            if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement, NULL) == SQLITE_OK) {
                
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                NSString *nsdate = [dateFormatter stringFromDate:model.date];
                
                //绑定参数开始
                sqlite3_bind_text(statement, 1, [model.content UTF8String], -1, NULL);
                sqlite3_bind_text(statement, 2, [nsdate UTF8String], -1, NULL);
                //执行
                if (sqlite3_step(statement) != SQLITE_DONE) {
                    NSAssert(NO, @"修改数据失败。");
                }
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
        return 0;
    }
    
    //查询所有数据方法
    -(NSMutableArray*) findAll
    {
        
        NSString *path = [self applicationDocumentsDirectoryFile];
        NSMutableArray *listData = [[NSMutableArray alloc] init];
        
        if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(NO,@"数据库打开失败。");
        } else {
            
            NSString *qsql = @"SELECT cdate,content FROM Persistence03Note";
            
            sqlite3_stmt *statement;
            //预处理过程
            if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, NULL) == SQLITE_OK) {
                
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                
                //执行
                while (sqlite3_step(statement) == SQLITE_ROW) {
                    char *cdate = (char *) sqlite3_column_text(statement, 0);
                    NSString *nscdate = [[NSString alloc] initWithUTF8String: cdate];
                    
                    char *content = (char *) sqlite3_column_text(statement, 1);
                    NSString * nscontent = [[NSString alloc] initWithUTF8String: content];
                    
                    Persistence03Note* persistence03Note = [[Persistence03Note alloc] init];
                    persistence03Note.date = [dateFormatter dateFromString:nscdate];
                    persistence03Note.content = nscontent;
                    
                    [listData addObject:persistence03Note];
                    
                }
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
            
        }
        return listData;
    }
    
    //按照主键查询数据方法
    -(Persistence03Note*) findById:(Persistence03Note*)model
    {
        
        NSString *path = [self applicationDocumentsDirectoryFile];
        
        if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
            sqlite3_close(db);
            NSAssert(NO,@"数据库打开失败。");
        } else {
            
            NSString *qsql = @"SELECT cdate,content FROM Persistence03Note where cdate =?";
            
            sqlite3_stmt *statement;
            //预处理过程
            if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, NULL) == SQLITE_OK) {
                //准备参数
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                NSString *nsdate = [dateFormatter stringFromDate:model.date];
                //绑定参数开始
                sqlite3_bind_text(statement, 1, [nsdate UTF8String], -1, NULL);
                
                //执行
                if (sqlite3_step(statement) == SQLITE_ROW) {
                    char *cdate = (char *) sqlite3_column_text(statement, 0);
                    NSString *nscdate = [[NSString alloc] initWithUTF8String: cdate];
                    
                    char *content = (char *) sqlite3_column_text(statement, 1);
                    NSString * nscontent = [[NSString alloc] initWithUTF8String: content];
                    
                    Persistence03Note* persistence03Note = [[Persistence03Note alloc] init];
                    persistence03Note.date = [dateFormatter dateFromString:nscdate];
                    persistence03Note.content = nscontent;
                    
                    sqlite3_finalize(statement);
                    sqlite3_close(db);
                    
                    return persistence03Note;
                }
            }
            
            sqlite3_finalize(statement);
            sqlite3_close(db);
            
        }
        return nil;
    }
    
    
    @end
  • 相关阅读:
    wp7订餐客户端源码
    AOP技术术语
    urlpattern详解
    .net 访问IBM DB2 数据库
    入驻博客园
    hadoop视频
    阿里OneData构建数据指标体系
    大数据领域全景解析
    PyTorch中梯度为什么默认自动累加,在反向传播前要手动将梯度清零?
    Pytorch:Dataloader和Dataset以及搭建数据部分的步骤
  • 原文地址:https://www.cnblogs.com/cqchen/p/3793854.html
Copyright © 2011-2022 走看看