使用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);
}
使用SQLite3持久保存应用程序数据的更多相关文章
- Docker最全教程——数据库容器化之持久保存数据(十一)
上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql.Redis.Mongodb等等)的 ...
- C# 如何使用配置文件保存应用程序里的配置数据
引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置.这样每次都要建立单独的配置类,并书写读写配置 ...
- [MISS静IOS开发原创文摘]-AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象
由于app开发的需求,需要从api接口获得json格式数据并保存临时的 app的主题颜色 和 相关url 方案有很多种: 1, 通过AppDelegate保存为全局变量,再获取 2,使用NSUSerD ...
- 【转】基本数据持久性(一) 使用plist保存和读取数据
原文网址:http://www.it165.net/pro/html/201309/7170.html 想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享 ...
- 微信小程序数据请求方法wx.request小测试
微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...
- TensorFlow从1到2(四)时尚单品识别和保存、恢复训练数据
Fashion Mnist --- 一个图片识别的延伸案例 在TensorFlow官方新的教程中,第一个例子使用了由MNIST延伸而来的新程序. 这个程序使用一组时尚单品的图片对模型进行训练,比如T恤 ...
- @1-5使用pandas保存豆瓣短评数据
使用pandas保存豆瓣短评数据 Python爬虫(入门+进阶) DC学院 本节课程的内容是介绍open函数和pandas两种保存已爬取的数据的方法,并通过实际例子使用pandas保存数据. ...
- php实现input输入框失去焦点自动保存输入框的数据
最近做一个输入框失去焦点时自动保存数据的功能,当然就是jQuery选择器选择input,blur时,ajax提交数据给php文件,php文件保存一下数据咯.主要是要注意一下中文的问题,所以中间需要转一 ...
- [android]-如何在向服务器发送request时附加已保存的cookie数据
[android]-如何在向服务器发送request时附加已保存的cookie数据 应用场景:在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务 ...
随机推荐
- MVC网站发布常见问题
直接发布的时候生成的bin会漏掉一些文件,从而导致网站无法访问: 解决方法:发布之后,再在本地运行一下网站,然后将运行后生成的bin文件夹下的文件拷贝到发布的文件夹目录下进行覆盖,就可以了
- iOS开发——开发必备OC篇&UITableView设置界面完整封装(一)
UITableView设置界面完整封装(一) 简单MVC实现UITableView设置界面分组数据显示 一:模型 1:cell模型 /** 描述cell图片 */ @property (nonatom ...
- Gtest源码剖析:1.实现一个超级简单的测试框架xtest
下面的代码模仿gtest实现,主要说明了以下两点: ASSERT_* 和 EXPECT_*系列断言的原理和作用. gtest是怎样通过宏自动注册测试代码让其自动运行的. #include <io ...
- 【ZZ】快速學會開發Android App
http://www.cc.ntu.edu.tw/chinese/epaper/0022/20120920_2209.html 作者:吳玉舒 / 臺灣大學計算機及資訊網路中心程式設計組幹事 智慧型手機 ...
- 终端I/O之终端选项标志
http://www.cnblogs.com/nufangrensheng/p/3575752.html 中的表18-1至表18-4中列出的所有选项标志(除屏蔽标志外)都用一位或几位(设置或清除)表示 ...
- C++ Qt 访问权限总结
总结:C++的访问修饰符的作用是以类为单位,而不是以对象为单位. 通俗的讲,同类的对象间可以“互相访问”对方的数据成员,只不过访问途径不是直接访问. 步骤是:通过一个对象调用其public成员函数,此 ...
- php demo
//上一周最后一天,上一个月最后一天: $y = date('Y',strtotime($endTime)); $m = date('m',strtotime($endTime)); ...
- Linux服务器集群系统(三)--转
引用地址:http://www.linuxvirtualserver.org/zh/lvs3.html LVS集群中的IP负载均衡技术 章文嵩(wensong@linux-vs.org) 2002 年 ...
- ajax步骤和理解
步骤: 1.利用html+css来实现页面,表达信息: 2.用XMLHttpRequest和web服务器进行数据的异步交换 3.运营js操作DOM,实现动态局部刷新: XMLHttpRequest对象 ...
- Ultra Edit常用正则表达式
一.怎样可以删除包含特殊字符的行? 你可以用正则表示式全部替换命令替换行中包含的字符.要执行这个操作,你应该先进行查找: 查找: %*YOUR STRING*^p 替换为: (随便什么文字) 帮助文件 ...