使用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); }