IOS开发-本地持久化存储sqlite应用
- 前言
- 需求描述
- 开发测试环境
- FMDB介绍
- 创建工程
一、前言
上一章介绍了如何开发一个IOS应用的入门案例教程:
二、需求描述
在游戏开始一段时间后,我们需要存储角色的基础信息,以便我休息之后继续进行上次的旅途。
三、开发环境介绍
OS X EI Captian:10.11.4 Xcode: 7.3
ios:9.3
机型:iphone 6s/iphone 6s plus
四、FMDB介绍
iOS中的数据持久化方式,基本上有以下四种: 1. 属性列表
2. 对象归档
3. SQLite3
4. Core Data
本文主要介绍如何使用“SQLite3” 持久化方式。
SQLite:是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,
SQLite可移植性好,很容易使用,很小,高效而且可靠。
参考地址:http://www.sqlite.org/ FMDB:iOS、macOS开源的第三方库对SQLite的操作进行了封装。
参考地址:https://github.com/ccgus/fmdb.git
五、创建工程
Xcode 英文版:
1.“Create a new Xcode project”
2.“Choose a template for your new project”> iOS > Application > Single View Application
3. “Choose options for your new project”
Bundle Identifier:cn.oshine.ios.Lesson02,
Language : Objective-C ,
Devices: iPhone ,
Use Core Data: No,
include Unit Tests: No,
include UI Tests: No
4. "Select Folder To Create"
下载FMDB,FMDB的目录结构

把fmdb.xcodeproj拖动到工作区中。
Lesson02 TARGETS :
Build Pharses:
Target Dependencies > FMDB iOS(fmdb)
Link Binary With Libraries > libsqlite3.0.tbd
Link Binary With Libraries > libFMDB-iOS.a

引入头文件:
#import <Foundation/Foundation.h> #import "fmdb/FMDB.h" #import <sqlite3.h>
创建数据库:
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open]) {
NSLog(@"OPEN FAIL");
return;
}
关闭数据库:
[db close];
创建表:
[db executeUpdate:@"CREATE TABLE IF NOT EXISTS profile(name text,val text)"];
插入记录:
[db beginTransaction];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"HP",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"MP",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻击",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"防御",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻速",@"0.3"];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"移速",@""];
[db commit];
读取记录:
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
if (![db open]) {
NSLog(@"OPEN FAIL");
return;
}
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
FMResultSet *rs = [db executeQuery:@"SELECT name,val FROM profile"];
while ([rs next]) {
[dictionary setObject:[rs stringForColumn:@"val"] forKey:[rs stringForColumn:@"name"]];
}
[rs close];
[db close];
案例界面:

案例代码:



运行结果:

ViewController.h
//
// ViewController.h
// Lesson02
//
// Created by ouyangjunqiu on 16/4/7.
// Copyright © 2016年 oshine. All rights reserved.
// #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "fmdb/FMDB.h"
#import <sqlite3.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *label; - (IBAction)createTable:(id)sender; - (IBAction)initRole:(id)sender; - (IBAction)readProfile:(id)sender; @end
ViewController.m
//
// ViewController.m
// Lesson02
//
// Created by ouyangjunqiu on 16/4/7.
// Copyright © 2016年 oshine. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)createTable:(id)sender {
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; if (![db open]) {
NSLog(@"OPEN FAIL");
return;
} [db executeUpdate:@"CREATE TABLE IF NOT EXISTS profile(name text,val text)"];
[db close];
} - (IBAction)initRole:(id)sender {
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; if (![db open]) {
NSLog(@"OPEN FAIL");
return;
} [db beginTransaction];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"HP",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"MP",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻击",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"防御",@""];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻速",@"0.3"];
[db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"移速",@""];
[db commit];
[db close]; } - (IBAction)readProfile:(id)sender{
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; if (![db open]) {
NSLog(@"OPEN FAIL");
return;
}
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
FMResultSet *rs = [db executeQuery:@"SELECT name,val FROM profile"];
while ([rs next]) {
[dictionary setObject:[rs stringForColumn:@"val"] forKey:[rs stringForColumn:@"name"]];
}
[rs close];
[db close]; [self show:dictionary];
} -(void)show:(NSMutableDictionary *)dictionary { self.label.numberOfLines = ; NSString * text = [[NSString alloc] init];
for(NSString *key in dictionary) {
text = [NSString stringWithFormat:@"%@%@:%@\n",text,key,[dictionary objectForKey:key]];
}
self.label.text = text;
} @end
案例结束
NSMutableDictionary Class Reference (key->value可增长数组)
IOS开发-本地持久化存储sqlite应用的更多相关文章
- iOS 关于本地持久化存储的探讨
目前,用以本地化存储的方式有很多,常用的有以下: 1.临时缓存 先说说临时缓存,临时缓存一般相当于用来管理应用程序中全局需要常用的一些内容.比如当前用户的ID或者当前的定位信息等. 常用的方式就是写一 ...
- 李洪强iOS开发之数据存储
李洪强iOS开发之数据存储 iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) ...
- Windows 8 应用开发 - 本地数据存储
原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...
- iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储
使用NSUserDefaults来进行本地数据存储 NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...
- IOS开发--数据持久化篇之文件存储(一)
前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...
- iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储
使用Core Data进行数据持久化存储 一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...
- IOS开发--数据持久化篇文件存储(二)
前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...
- iOS数据本地持久化
p1:归档.Preference(NSUserDefault).沙盒存储 iOS开发中本地存储主要有三种形式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedAr ...
- Unity本地数据存储---Sqlite和JSON
2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...
随机推荐
- ADT-bundle(Android Development Tools)环境配置
Android开发环境有两套比较主流的:ADT-bundle和Android Studio,前者是Eclipse插件的形式进行开发,后者是Android的官方IDE. ADT环境的配置与调试:(1)安 ...
- js实现无刷新表单提交文件,将ajax请求转换为form请求方法
最近在做项目的时候遇到一个需要上传文件的需求,因为ajax请求是无法上传二进制文件流的,所以只能用form表单提交,而form提交有一个问题就是会使页面刷新,本文解决了form表单提交文件时页面刷新的 ...
- 浅谈DOM性能考虑
浅谈DOM性能考虑 很多人都会忽视脚本对Web应用整体性能的影响.为保证应用的流畅运行,在为文档编写和应用脚本时,需要注意一些问题.一.尽量减少访问DOM和尽量减少标记 访问DOM的方式对脚本性 ...
- CentOS6.5菜鸟之旅:安装ATI显卡驱动
一.前言 自从安装了CentOS,我的显卡就没消停过,一直在彪高温而且噪音特别大,于是决定上网搜索解决办法.下面记录下来以供日后查阅. 二.安装fglrx driver(ATI/AMD 显卡的linu ...
- 【Spark】---- Spark 硬件配置
存储系统 Spark任务需要从一些外部的存储系统加载数据(如:HDFS 或者 HBase),重要的是存储系统要接近Spark系统,我们有如下推荐: (1)如果可能,运行Spark在相同的HDFS节 ...
- Spring应用——对 JDBC 的支持
一.说明 1.Spring JDBC 对原始的 JDBC 进行了封装,使其更加易用. 2.JdbcTemplate 作为 Spring JDBC 的核心,为不同类型的 JDBC 操作提供了模板方法. ...
- ok6410 android driver(3)
This article discusses the Makefile and how to port the module to different platform (localhost and ...
- 基于KV Data Model实现Table Data Model
HBase对外暴露出来的是一个表格数据模型,如下图所示 rowkey应用程序可以自己设计.每一个Cell可以保存多个版本的数据,由timestamp标示版本.应用程序可以自己指定timestamp,如 ...
- Equeue初识
详细解说: http://www.cnblogs.com/netfocus/p/3595410.html 简单代码用法: Producer 端代码用法实例 和 Customer 端代码用法示例: ht ...
- jquery ajax跨域访问webservice配置
1.webservice方法 [System.Web.Script.Services.ScriptService] public class TestService : System.Web.Serv ...