使用SQLite3持久保存应用程序数据

前言  

  SQL是一种数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统,因为强大的查询功能和简单的语法,已经成为主流数据库的标准语言。SQLite3是一种嵌入式的数据库,无需服务器支持,它将SQL语句嵌入到一般通用编程语言程序中去,SQL语句负责对数据库中数据的提取及操作,它所提取的数据将逐行提交给程序,程序中其他语句负责数据的处理。Sqlite3的程序接口是基于C语言的,它在存储和检索大量数据上非常有效,而且能够聚合复杂的数据,更快地处理数据获取结果。与使用对象处理数据相比,最大的优点就是不必把所有的对象加载到内存中,而只是提取符合特定条件的对象。

  在项目中使用SQLite3的开发流程

  1.设计生产数据库

  第一步、下载安装SQLite Manager工具:首先打开火狐浏览器,在工具下面选择“附加组件”,在浏览器右上角的搜索框中输入“SQLite”,然后选择并安装SQLite Manager。

 

  第二步、安装完成后会提示是否重新启动浏览器,重新启动后,再次点击工具会看到SQLite Manager已经出现在选项中。打开它可以看到下图数据库工具界面,到这里我们就完成了下载安装SQLite Manager工具的操作。

  第三步、创建SQLite3数据库:首先,在SQLite Manager中,选择空白新建图标,新建一个数据库,输入定义的数据库名NoteSQL.sqlite。

  第四步、然后,点击Create Table图标,创建一个新的表并命名为NoteSQL。编辑表中的内容。最后就完成了数据库的创建工作。

 

  2.创建项目并把数据库文件导入到项目中

  第一步、将刚才创建的数据库加到你的项目工程目录下。

  第二步、点击工程名-》TARGETS-》Build Phases,选择Link Binary With Libraires,加入libsqlite3.tbd文件。

  

  3.用数据库写入和读取数据

第一步、进行数据库的复制操作,将我们加入工程的数据库,复制一份到我们的应用程序的Documents文件目录下

//数据库的复制操作
- (void)createDatabaseIfNeeded:(NSString *)filename{
    BOOL success;
    NSFileManager * fileManager = [NSFileManager defaultManager];
    NSError * error;
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * writableDBPath = [documentsDirectory stringByAppendingPathComponent:filename];
    NSLog(@"%@",writableDBPath);
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success) {
        return;
    }
    NSString * defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:filename];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

 第二步、打开数据库

//打开数据库
- (void)openDB{
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documenthPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"NoteSQL.sqlite"];
    int returnValue = sqlite3_open([documenthPath UTF8String], &database);
    if (returnValue != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
    }
}

 第三步、打开数据库插入数据

if (sqlite3_open([[self dataFilePath] UTF8String], &_database) != SQLITE_OK) {
            sqlite3_close(_database);
            NSAssert(0, @"Failed to open database");
        }
        //插入操作
        NSString * insertSQL = [[NSString alloc] initWithFormat:@"insert into NoteSQL(title, date, types, content) values('%@','%@','%@','%@')",titleStr, dateStr, typesStr, contentStr];
        char * errorMsg2;
        if (sqlite3_exec(_database, [insertSQL UTF8String], NULL, NULL, &errorMsg2) != SQLITE_OK) {
            NSAssert1(0, @"Error updating tables:%s", errorMsg2);
            sqlite3_free(errorMsg2);
        }
sqlite3_close(_database);

 第四步、打开数据库并从中读取数据

if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    }
    NSString * query = @"select * from NoteSQL order by date";
    sqlite3_stmt * statement;
    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            char * titleChar = (char *)sqlite3_column_text(statement, 0);
            char * dateChar = (char *)sqlite3_column_text(statement, 1);
            char * typesChar = (char *)sqlite3_column_text(statement, 2);
            char * contentChar = (char *)sqlite3_column_text(statement, 3);
            
            //C 字符串转换成NSString
            NSString * title = [[NSString alloc] initWithUTF8String:titleChar];
            NSString * date = [[NSString alloc] initWithUTF8String:dateChar];
            NSString * types = [[NSString alloc] initWithUTF8String:typesChar];
            
            NSString * content = [[NSString alloc] initWithUTF8String:contentChar];
            
            recordInfo * record = [[recordInfo alloc] init];
            record.title = [title copy];
            record.types = [types copy];
            record.date = [date copy];
            record.content = [content copy];
            [mutArray addObject:record];
        }
        sqlite3_finalize(statement);
    }

 

posted @ 2016-08-11 15:43  Make.Langmuir  阅读(1948)  评论(2编辑  收藏  举报