1. 前言
  2. 需求描述
  3. 开发测试环境
  4. FMDB介绍
  5. 创建工程

一、前言

上一章介绍了如何开发一个IOS应用的入门案例教程:

                    我的第一个IOS开发应用 
 
  本章主要将介绍如何使用sqlite,来进行本地持久化存储数据。
 

二、需求描述

在游戏开始一段时间后,我们需要存储角色的基础信息,以便我休息之后继续进行上次的旅途。

三、开发环境介绍

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可增长数组)

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/

IOS开发-本地持久化存储sqlite应用的更多相关文章

  1. iOS 关于本地持久化存储的探讨

    目前,用以本地化存储的方式有很多,常用的有以下: 1.临时缓存 先说说临时缓存,临时缓存一般相当于用来管理应用程序中全局需要常用的一些内容.比如当前用户的ID或者当前的定位信息等. 常用的方式就是写一 ...

  2. 李洪强iOS开发之数据存储

    李洪强iOS开发之数据存储 iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) ...

  3. Windows 8 应用开发 - 本地数据存储

    原文:Windows 8 应用开发 - 本地数据存储      在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...

  4. iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储

    使用NSUserDefaults来进行本地数据存储   NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...

  5. IOS开发--数据持久化篇之文件存储(一)

    前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...

  6. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  7. IOS开发--数据持久化篇文件存储(二)

    前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...

  8. iOS数据本地持久化

      p1:归档.Preference(NSUserDefault).沙盒存储 iOS开发中本地存储主要有三种形式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedAr ...

  9. Unity本地数据存储---Sqlite和JSON

    2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...

随机推荐

  1. Mybatis对MySQL中BLOB字段的读取

    1.在sqlMapConfig中,定义一个typeHandlers <typeHandlers> <typeHandler jdbcType="BLOB" jav ...

  2. ruby -- 基础学习(八)中文字符串截取的函数

    学习来源:http://www.codesky.net/article/200910/166595.html truncate(text, length = 30, truncate_string = ...

  3. 读Java Concurrency in Practice. 第六章.

    这一章开讲任务执行.绝大多数并发程序的工作都可以分解为抽象的.互不相关的工作单元,称之为任务(Task). 使用java线程来执行任务 以web服务器的实现举例, 此时将用户的一次连接,当做一个独立的 ...

  4. sqlserver查找表在哪个数据库脚本

    EXEC sp_MSforeachdb @command1='IF object_id(''?'' + ''..table_name'') IS NOT NULL PRINT ''?'''

  5. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  6. 谈论XSS

    XSS 叫跨站脚本攻击(Cross Site Script),那么XSS原本应该叫做CSS,但是由于CSS的简称已经被连级样式表 使用了,所以就换个称谓XSS. 为什么叫做跨站脚本攻击呢? 它的意思就 ...

  7. .Net魔法堂:发个带附件的邮件

    一.前言   由于工作需要最近把邮件发送封装成WebService,现在把代码记录在此,以便日后查阅. 二.二话不说写代码 private void _SendMail(string form, st ...

  8. 转载:全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新!

    微信应用号(小程序,「应用号」的新称呼)终于来了! 目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子?怎样将一个「服务号」改造成为「小程序」? 我们暂时以 ...

  9. React Native实践之携程Moles框架

    编者:本文来自携程框架研发部高级经理魏晓军在第二期[携程技术微分享]上的分享,以下为整理后的文字实录.视频回放可点击这里.关注携程技术中心微信公号ctriptech,可获知更多微分享课程信息. 因为支 ...

  10. SQL Server中中数据行批量插入脚本的存储实现

        看到博友SQL Server MVP桦仔的一篇博文“将表里的数据批量生成INSERT语句的存储过程的实现”.我仔细看来博文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数 ...