IOS开发指南读书笔记11(IOS数据持久层的建立3)

原创 2015年11月18日 11:41:14
IOS开发指南读书笔记11(IOS数据持久层的建立3)
基于SQLite的数据持久的实现

建立SQLite数据管理

//sqlite数据管理

@interface SQLiteNoteDao : NSObject<BaseNoteDao>
{
 
sqlite3* _db;
 
}

#define DBName @"Notes.sqlite3"
 
@end 

为Note添加一个方法

-(id)initWithSqliteStmt:(sqlite3_stmt *)statement

{

    self = [super init];

    if (self) {

        //第二个参数为字段编号从0开始

        char* cID = (char*)sqlite3_column_text(statement, 0);

        self.ID = [[[NSString alloc]initWithUTF8String:cID] integerValue];

        

        char* cContent = (char*)sqlite3_column_text(statement, 1);

        self.content = [[NSString alloc]initWithUTF8String:cContent];

    }

    return self;

}


具体实现

@implementation SQLiteNoteDao


+(id)sharedManager

{

    static dispatch_once_t onceToken;

    __block SQLiteNoteDao* instance = nil;

    dispatch_once(&onceToken, ^{

        instance = [[SQLiteNoteDao alloc]init];

        [instance createObjectCacheFile];

    });

    return instance;

}


-(void)createObjectCacheFile

{

    

    if ([self openDB]) {

        char* err;

        NSString* createTableSQL = @"CREATE TABLE IF NOT EXISTS Note(ID INTEGER PRIMARY KEY,content TEXT)";

        if (sqlite3_exec(_db, [createTableSQL UTF8String], NULLNULL, &err)!= SQLITE_OK) {

            sqlite3_close(_db);

            NSAssert1(NO@"建表失败,%s",err);

        }

        sqlite3_close(_db);

    }

}


-(NSString *)ObjectCacheFilePath

{

    NSString* documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectoryNSUserDomainMaskYESlastObject];

    return [documentDirectory stringByAppendingPathComponent:DBName];

}


-(BOOL)openDB

{

    NSString* dbPath = [self ObjectCacheFilePath];

    if (sqlite3_open([dbPath UTF8String], &_db)!= SQLITE_OK) {

        sqlite3_close(_db);

        NSAssert(NO@"数据库打开失败");

        return NO;

    }

    return YES;

}


-(void)addNote:(Note *)note

{

    if ([self openDB]) {

        NSString* exeSql = @"INSERT INTO Note(ID,content) VALUES(?,?)";

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(_db, [exeSql UTF8String], -1, &statement, NULL) == SQLITE_OK) {

            

            sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%d",note.ID]UTF8String], -1nil);

             sqlite3_bind_text(statement, 2, [note.content UTF8String], -1nil);

            

            if (sqlite3_step(statement) != SQLITE_DONE) {

                NSAssert(NO@"数据库插入失败");

            }

        }

        sqlite3_finalize(statement);

        sqlite3_close(_db);

    }

}


-(void)removeNote:(Note *)note

{

    if ([self openDB]) {

        NSString* exeSql = @"DELETE FRON Note where ID=?";

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(_db, [exeSql UTF8String], -1, &statement, NULL) == SQLITE_OK) {

            

            sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%d",note.ID]UTF8String], -1nil);

            

            if (sqlite3_step(statement) != SQLITE_DONE) {

                NSAssert(NO@"数据库插入失败");

            }

        }

        sqlite3_finalize(statement);

        sqlite3_close(_db);

    }

}


-(void)modify:(Note *)note

{

    if ([self openDB]) {

        NSString* exeSql = @"UPDATE Note set content=? and ID=?";

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(_db, [exeSql UTF8String], -1, &statement, NULL) == SQLITE_OK) {

            

            sqlite3_bind_text(statement, 2, [[NSString stringWithFormat:@"%d",note.ID]UTF8String], -1nil);

            sqlite3_bind_text(statement, 1, [note.content UTF8String], -1nil);

            

            if (sqlite3_step(statement) != SQLITE_DONE) {

                NSAssert(NO@"数据库插入失败");

            }

        }

        sqlite3_finalize(statement);

        sqlite3_close(_db);

    }

}


-(NSMutableArray*)queryAllNote

{

    NSMutableArray* datas = [NSMutableArray array];

    if ([self openDB]) {

        NSString* exeSql = @"SELECT * FROM Note";

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(_db, [exeSql UTF8String], -1, &statement, NULL) == SQLITE_OK) {

            

            while (sqlite3_step(statement) == SQLITE_ROW) {

                Note* note = [[Note alloc]initWithSqliteStmt:statement];

                [datas addObject:note];

            }

        }

        sqlite3_finalize(statement);

        sqlite3_close(_db);

    }

    return datas;

}


-(Note*)queryNoteByID:(NSInteger)ID

{

    if ([self openDB]) {

        NSString* exeSql = [NSString stringWithFormat:@"SELECT * FROM Note where ID=%d",ID];

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(_db, [exeSql UTF8String], -1, &statement, NULL)) {

            //第二个参数为字段编号从1开始

            sqlite3_bind_text(statement, 1, [[NSString stringWithFormat:@"%d",ID]UTF8String], -1NULL);

            

            if (sqlite3_step(statement) == SQLITE_ROW) {

                Note* note = [[Note alloc]initWithSqliteStmt:statement];

                sqlite3_finalize(statement);

                sqlite3_close(_db);

                return note;

            }

        }

        sqlite3_finalize(statement);

        sqlite3_close(_db);

    }

    return nil;

}



@end 


IOS开发指南读书笔记12(IOS数据持久层的建立4)

IOS开发指南读书笔记12(IOS数据持久层的建立4)  建立CoreData需要首先建立一个模型文件 生成的后缀是xcdatamodeid,但是编译之后在沙盒的momd文件 首先A...

OS开发指南读书笔记9(IOS数据持久层的建立1)

IOS开发指南读书笔记9(IOS数据持久层的建立1)  建立IOS数据持久层,有以下几个方式 1、文本文件 plist/Xml/Json/NSUserDefault(等同于plist) 2、...

12-读书笔记----iOS开发指南:从零基础到App Store上架--iOS-数据持久化

iOS-国际化
  • blacet
  • blacet
  • 2016年05月13日 10:32
  • 332

《iOS开发指南:从零基础到App Store上架》读书笔记(二)

P230 NSLayoutManager、NSTextContainer、NSTextStorage之间究竟是什么关系呢?NSLayoutManager对象从NSTextStorage对象中取得文本内...

IOS开发指南读书笔记2(应用程序的生命周期)

1、程序的五种状态 Not Running:未运行。 Inactive:前台非活动状态。处于前台,但是不能接受事件处理。 Active:前台活动状态。处于前台,能接受事件处理。 Backgro...

IOS开发指南读书笔记8(AutoLayout) 2

IOS开发指南读书笔记8(AutoLayout) 其原理类似Android的RelativeLayout,适用于IOS6以上。如果不同约束有冲突,回遵循优先级的高的约束。 一、可以...

IOS开发指南读书笔记1(Xcode的基本使用)

IOS开发指南读书笔记1(Xcode的基本使用) 1、用Xcode创建工程 Product Name:工程名字 Organization Name:组织名字 Company Identifier:...

2-读书笔记----iOS开发指南:从零基础到App Store上架--iOS视图和控件

视图和控件 UIView“家族” UIView类的继承层次 应用界面的构建层次 iOS应用界面是由若干个视图构建而成的,这些视图对象采用树形构建 视图分类 为了便于开发,苹果将UIKi...
  • blacet
  • blacet
  • 2015年11月20日 00:12
  • 692

4-读书笔记----iOS开发指南:从零基础到App Store上架--iOS视图控制器与导航模式

视图控制器与导航模式 介绍平铺导航、标签导航、树形结构导航的使用方式 与导航相关的视图控制器整理如下。  UIViewController。用于自定义视图控制器的导航。例如,对于两个界面的...
  • blacet
  • blacet
  • 2015年11月30日 01:14
  • 694

1-读书笔记----iOS开发指南:从零基础到App Store上架--iOS入门

iOS的系统架构分为4层——Cocoa Touch层、Media层、Core Services层和Core OS层 AppDelegate类是应用程序委托对象,这个类中继承的一系列方法在应用生...
  • blacet
  • blacet
  • 2015年11月08日 21:46
  • 899
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS开发指南读书笔记11(IOS数据持久层的建立3)
举报原因:
原因补充:

(最多只允许输入30个字)