你的位置:首页 > 操作系统

[操作系统]使用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);  }