IOS開發-本地持久化存儲sqlite應用

来源:http://www.cnblogs.com/oshine/archive/2016/04/08/5368515.html
-Advertisement-
Play Games

<!--StartFragment--> 本文主要介紹如何使用“SQLite3” 持久化方式。 Xcode 英文版: 1.“Create a new Xcode project” 2.“Choose a template for your new project”> iOS > Applicatio ...


  1. 需求描述
  2. 開發環境介紹
  3. FMDB介紹
  4. 創建工程
  5. 引入FMDB到工程
  6. 使用案例代碼
  7. 運行展示

 

 

在游戲開始一段時間後,我們需要存儲角色的基礎信息,以便我休息之後繼續進行上次的旅途。

 

OS X EI Captian10.11.4

Xcode 7.3
ios:9.3
機型:iphone 6s/iphone 6s plus

 

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 projectiOS > Application > Single View Application

 

 

3. “Choose options for your new project”

Bundle Identifiercn.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",@"600"];

    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"MP",@"250"];

    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻擊",@"70"];

    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"防禦",@"1"];

    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻速",@"0.3"];

    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"移速",@"320"];

    [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",@"600"];
    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"MP",@"250"];
    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻擊",@"70"];
    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"防禦",@"1"];
    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"攻速",@"0.3"];
    [db executeUpdate:@"INSERT INTO profile(name,val) VALUES (?,?)",@"移速",@"320"];
    [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 = 0;
    
    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/tvos/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在github上面有很多的第三方類庫,大大節約了大家的開發時間 下載地址:https://github.com/gsdios/SDCycleScrollView 現已支持cocoapods導入:pod 'SDCycleScrollView','~> 1.61' 效果 具體實現代碼 ...
  • 前言 在iOS開發中,很多公司對項目的版本控制管理都使用了git,當然也有部分公司使用的是svn。當年我最初接觸的是svn,覺得使用起來挺方便的,但是每次切分支都需要下載一份新的代碼起來,這實在太麻煩了,而且公司的網路下載一個項目的所有資源起來也有數百M,這還用工作麽? 當年,第一次聽說github ...
  • 1、墨刀 https://modao.cc/ ...
  • Android內打日誌用的當然是Log.i(tag,string),調試時的日誌輸出可以很快的反映一些問題,方便我們跟進。 但是如果連日誌都打不出來了怎麼辦呢,我今天就遇到了比較坑的問題。項目里別的日誌都輸出正常,偏偏我寫的Log.i沒有列印出東西,過濾器,進程,什麼的,都設置好了,日誌死活出不來。 ...
  • 上次學習了 "iOS學習筆記09 核心動畫CoreAnimation" ,這次繼續學習動畫,上次使用的 很多人感覺使用起來很繁瑣,有沒有更加方便的動畫效果實現呢?答案是有的,那就是 UIView動畫封裝 一、UIView動畫 蘋果知道圖層動畫使用麻煩,就為我們封裝到了 里,使我們可以簡單的實現各種動 ...
  • 最近打算寫一個系列的android初級開發教程,預計40篇以上的文章,結合我實際工作中的經驗,寫一些工作中經常用到的技術,讓初學者可以少走彎路,寫一個系列的話,大家學習起來也有頭有尾。 今天就從我們每天都會用到的TextView講起. 1.設置背景顏色 2.如何在程式裡面動態賦值 這裡可以直接是字元 ...
  • 本章繼續講解在Android開發中,數據的存儲與管理。涉及知識點:SQLite,SwipeRefreshLayout控制項刷新。 1.功能需求 練習使用SQLite 做一個登錄界面,資料庫欄位包含用戶名、密碼以及是否登錄中的狀態 模擬登錄成功後,將登錄的用戶名及登錄狀態(登錄中)寫入資料庫,並跳轉新頁 ...
  • 這幾天做了一個查看股票行情的app. 完成之後,當k線比較多的時候,app 對於捏合、拖動手勢的反應不太流暢, 主要原因是drawRect: 乾的活太多, 竟然需要40ms+, fps 自然不高 最後按照下麵這些原則,進行調整修改,流暢度提高不少,大多數的繪製時間控制在了10ms左右 總結如下: 1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...