使用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基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务 ...
随机推荐
- 关于C#资源文件操作的总结
// 在这里,我来总结一下关于资源文件的相关操作. //1. 比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 // 比较典型的做法是通过代码程序集加载指定资源 // 如下通过Assemb ...
- openldap 安装 配置 使用
1.安装 #安装 yum install -y openldap-servers openldap-clients openldap-devel 2.复制配置文件 #复制配置文件 cp /usr/sh ...
- ueditor 编辑器再thinkphp中使用 解决转义问题
在前台common.php文件中加入下面的函数就可以解决了 <?php //取消thinkphp里面的转义 if (get_magic_quotes_gpc()) { function stri ...
- Android学习之路
Android基础 整理下个人认为新手们必须要掌握的知识点,顺便也会附带相应觉得不错的讲解博客地址. 两分钟彻底让你明白Android Activity生命周期(图文)! Activity实际开发中使 ...
- 翻译学python---《Learn Python the hard Way》---第一章 绪论
打算学习python,但是又不想单纯地看书或是写个小项目,干脆引入很流行的翻译学习法来学习吧- 在论坛上看到了国外的一本<Learn Python the hard Way> ...
- Eclipse目录
1. 解决Ubuntu下的Eclipse打开Windows编写的java代码的中文乱码 2. Eclipse常用快捷键
- 标准库 - fmt/format.go 解读
// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...
- LeetCode28 Implement strStr()
题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ne ...
- spark1.2.0安装
standalone 安装SCALA 下载.解压.加入环境变量 安装spark1.2.0 下载.解压.加入环境变量 tar zxvf spark--bin-.tgz export SPARK_HOME ...
- EF——一个实体对应两张表,两个实体对应一张表 06 (转)
本篇日记我们将详细探讨如何将表现领域的类映射到现有的数据库.现在的经济形势不是太好,很多公司都取消了开发新系统的预算.在这种情况下,通常的做法是把原有的几个系统修改一下做个集成,先凑合用着得了.如果要 ...