1. 程式人生 > >IOS 資料儲存之 SQLite詳解

IOS 資料儲存之 SQLite詳解

//  ViewController.m
//  JRSQLite查詢3
//
//  Created by jerehedu on 15/6/16.
//  Copyright (c) 2015年 jerehedu. All rights reserved.
//

#import "ViewController.h"
#import <sqlite3.h>

@interface ViewController ()
{
    sqlite3 *db;  //宣告資料庫物件
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
// 獲得資料庫路徑 // 獲得沙盒中Document資料夾路徑 NSString *dbPath = [self getUserDocumentPath]; // 拼接得到資料庫路徑 NSString *sqlitePath = [dbPath stringByAppendingPathComponent:@"test.sqlite"]; // 建立或開啟資料庫 const char *p = [sqlitePath UTF8String]; int res = sqlite3_open(p, &db); if
(res==SQLITE_OK) { NSLog(@"db open"); //<一>建立表格 NSString *sql = @"create table if not exists temps (t_id integer primary key autoincrement,t_name varchar(20) )"; if ([self execNoQueryWithSQL:sql]) { NSLog(@"table temps is created"); }
//<二>插入資料 NSString *insert_Sql = @"insert into temps (t_name) values ('pear')"; if ([self execNoQueryWithSQL:insert_Sql]) { NSLog(@"table insert "); } //<三>刪除資料 NSString *delete_sql = @"delete from temps where t_id=2"; if ([self execNoQueryWithSQL:delete_sql]) { NSLog(@"table delete "); } //<四>修改資料 NSString *update_sql = @"update temps set t_name='ios' where t_id=1"; if ([self execNoQueryWithSQL:update_sql]) { NSLog(@"table update "); } //<五>查詢簡單的資料1 NSString *select_sql1 = @"select * from temps where t_id=1"; sqlite3_stmt *stmt1 = [self execQueryWithSQL:select_sql1]; while (sqlite3_step(stmt1) == SQLITE_ROW) { //按照當前列的型別選資料,列數從0開始 int t_id = sqlite3_column_int(stmt1, 0); const unsigned char *t_name = sqlite3_column_text(stmt1, 1); NSString *name = [NSString stringWithUTF8String:(char*)t_name]; NSLog(@"%i %@",t_id,name); } //釋放stmt statement sqlite3_finalize(stmt1); //<五>查詢資料2 引數化的sql語句 查詢id>2 並且名字以p開頭的 //用?佔位 int seachId2 = 2; NSString *seach_name = @"p%"; NSString *seach_sql = @"select * from temps where t_id>? and t_name like ?"; sqlite3_stmt *stmt6 = [self execQueryWithSQL:seach_sql andWithParams:@[[NSNumber numberWithInt:seachId2],seach_name]]; //準備執行(相當於點選run query),執行的時候是一行一行的執行 while (sqlite3_step(stmt6) == SQLITE_ROW) { //按照當前列的型別選資料,列數從0開始 int t_id = sqlite3_column_int(stmt6, 0); const unsigned char *t_name = sqlite3_column_text(stmt6, 1); NSString *name = [NSString stringWithUTF8String:(char*)t_name]; NSLog(@"..>>>>>>...%i %@",t_id,name); } sqlite3_finalize(stmt6); } // 關閉資料庫 sqlite3_close(db); } #pragma mark - 獲得沙盒sandbox裡面document資料夾路徑 - (NSString *)getUserDocumentPath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [path firstObject]; return documentPath; } #pragma mark - 執行除查詢以外的資料庫操作方法 -(BOOL)execNoQueryWithSQL:(NSString*)sql { /* 執行 引數1:sqlite3 物件 引數2:c形式的 sql語句 引數3:回撥函式 引數4:回撥函式的引數 引數5:錯誤資訊(可以char型別指標接受錯誤資訊,用來查錯使用) */ if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL) == SQLITE_OK) { return YES; } return NO; } #pragma mark 返回查詢結果集(簡單無參) -(sqlite3_stmt *)execQueryWithSQL:(NSString*)sql { //執行sql語句之後,返回的結果語句 sqlite3_stmt *stmt; /* 準備執行查詢的sql語句 (相當於把查詢語句寫好) 引數3:sql語句長度,通常用-1表示(系統會自動計算),也可以用strlength函式計算 引數4:sql_stmt物件 (執行的物件) 引數5:未執行的sql語句 */ int pre_res = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL); //如果準備成功 if (pre_res == SQLITE_OK) { return stmt; } return NULL; } #pragma mark - 返回查詢結果集(有引數的) -(sqlite3_stmt *)execQueryWithSQL:(NSString *)sql andWithParams:(NSArray *)params { sqlite3_stmt *stmt; int pre_res = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL); if (pre_res == SQLITE_OK) { //有引數,迴圈繫結引數 if (params!=nil) { for (int i=0; i<params.count; i++) { id obj = params[i]; //繫結的資料型別可能為NSString或者NSNumber,或者資料為空,分別判斷 if (obj==nil) { //如果資料為nil sqlite3_bind_null(stmt, i+1); } else if ([obj respondsToSelector:@selector(objCType)]) { //當前的繫結的資料型別位NSNumber //NSNumber判斷包裝的是int?longInt?shortInt?float?double? /* strstr(引數1,引數2) (strstr() c中函式搜尋一個字串在另一個字串中的第一次出現,則該函式返回第一次匹配的字串的地址,找不到返回NULL) 判斷引數1中的字元在引數2的字串char*中出現的索引 [obj objCType] 如果obj是int返回字串i */ if (strstr("ilsILS", [obj objCType])) { /* 繫結引數 如果有where 引數1:sqlite_stmt物件 (statement結果集) 引數2:佔位符索引 從1開始 引數3:替代佔位符的真實引數 */ sqlite3_bind_int(stmt, i+1, [obj intValue]); } else if (strstr("fdFD", [obj objCType])) { sqlite3_bind_double(stmt, i+1, [obj doubleValue]); } else { stmt = nil; } } else if ([obj respondsToSelector:@selector(UTF8String)]) { //當前的繫結的資料型別位NSString 判斷是否有UTF8String方法 //用bind替換佔位符 索引從1開始 sqlite3_bind_text(stmt, i+1, [obj UTF8String], -1, NULL); } else { stmt = nil; } } return stmt; } } return NULL; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end

相關推薦

IOS 資料儲存 SQLite

// ViewController.m // JRSQLite查詢3 // // Created by jerehedu on 15/6/16. // Copyright (c) 2015年 jerehedu. All rights reserved. // #import "Vi

IOS 資料儲存 FMDB

// ViewController.m // JRFMDB // // Created by jerehedu on 15/6/18. // Copyright (c) 2015年 jerehedu. All rights reserved. // #import "ViewCon

IOS 資料儲存 Core Data

  Core Date是ios3.0後引入的資料持久化解決方案,它是是蘋果官方推薦使用的,不需要藉助第三方框架。Core Date實際上是對SQLite的封裝,提供了更高階的持久化方式。在對資料庫操作時,不需要使用sql語句,也就意味著即使不懂sql語句,也可以操作資料庫中的資料。   在各類應用開發中使用

Android 資料儲存 SQLite資料庫儲存

轉載自:https://www.cnblogs.com/woider/p/5136734.html ----------------------------------------SQLite資料庫---------------------------------------------- SQLite是一

[三]基礎資料型別Integer

Integer 基本資料型別int  的包裝類 Integer 型別的物件包含一個 int 型別的欄位 屬性簡介 值為 2^31-1 的常量,它表示 int 型別能夠表示的最大值 @Native public static final int

[八]基礎資料型別Double

將此物件與指定物件比較 當且僅當引數不是 null 而是 Double 物件,且表示的 Double 值與此物件表示的 double 值相同時,結果為 true 為此,當且僅當將方法 doubleToLongBits(double) 應用於兩個值所返回的 lon

[七]基礎資料型別Float

將此物件與指定物件進行比較 當且僅當引數不是 null 而是 Float 物件,且表示的 float 值與此物件表示的 float 值相同時,結果為 true 為此,當且僅當將方法 #floatToLongBits(double) 應用於兩個值所返回的 int 值相

Android資料儲存SQLite簡單用法

實現效果圖如下: activity_main.xml佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/a

第一行程式碼——第六章:資料儲存全方案——持久化技術

目錄: 6.1 持久化技術簡介 6.2 檔案儲存 6.2.1 將資料儲存到檔案中 6.2.2 從檔案中讀出資料 6.3 SharedPreferences 儲存 6.3.1 將資料儲存到SharedPreferences中 6.3.2 從SharedPreferenc

資料儲存SQLite與LitePal

SQLite 一.簡意: (1)SQLite:是一款輕量級關係資料庫,佔用資源少,執行速度快 (2)適用於大量複雜關係資料(file,sp此時不太適合) 二,用法: (1)建立一個類 繼承SQLiteOpenHelper,重寫onCreate()和onUpgrade()方法

第二行程式碼學習筆記——第六章:資料儲存全方案——持久化技術

本章要點 任何一個應用程式,總是不停的和資料打交道。 瞬時資料:指儲存在記憶體當中,有可能因為程式關閉或其他原因導致記憶體被回收而丟失的資料。 資料持久化技術,為了解決關鍵性資料的丟失。 6.1 持久化技術簡介 資料持久化技術:指那些記憶體中的瞬時

ANDROID開發SQLite

SQLite簡介 Google為Andriod的較大的資料處理提供了SQLite,他在資料儲存、管理、維護等各方面都相當出色,功能也非常的強大。SQLite具備下列特點: 1.輕量級 使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能

資料儲存全方案--持久化技術

持久化技術提供了一種機制可以讓資料在瞬時狀態和持久化狀態之間進行轉換。 Android中的資料持久化技術主要有: 1. 檔案儲存 2. SharedPreference 儲存 3. 資料庫儲存 1 檔案儲存 不會對儲存內容進行任何格式化處理

資料儲存SQLite

dbHelper.java package com.terry; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; i

Android開發學習SQLite

一.SQLite的介紹 1.SQLite簡介  SQLite是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目標是嵌入 式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援 Windo

Android資料儲存Sqlite採用SQLCipher資料庫加密實戰

前言:   最近研究了Android Sqlite資料庫(文章地址:http://www.cnblogs.com/whoislcj/p/5506294.html)以及ContentProvider程式間資料共享(http://www.cnblogs.com/whoislcj/p/5507928.html),

資料結構陣列

陣列(Array)是由相同型別的元素(element)集合組成的固定長度(Size)的一種資料結構。在記憶體中是連續儲存的,因此可以通過索引(Index)計算出某個元素的地址。 下面介紹都是已java為示例。對於沒有詳細瞭解過的  相信有所收穫。   基礎知識 宣告 type arrayN

資料hdfs三:put許可權剖析與常用命令

–無論是對於hdfs的讀和寫,對於使用者來說都是無感知的、透明的操作,使用者並不關心資料如何讀出來如何寫進去的,只要返回一個結果告訴使用者資料讀出來了或寫進去了,至於怎麼讀怎麼寫,使用者並不關心 補充: 讀:hdfs dfs -ls / = hdfs dfs

空間資料視覺化ArcLayer

deck-overlay中 首先使用d3中的scaleQuantile將資料進行分類,scaleQuantile方法是d3中的一種資料分類方法(https://www.cnblogs.com/kidsitcn/p/7182274.html)https://raw.githubusercontent.co

學機器學習,不會資料分析怎麼行?NumPy

你可以通過ndarray的astype方法明確地將一個數組從一個dtype轉換成另一個dtype: NumPy計算   這裡將介紹Numpy的一些基本計算 1.條件運算    2.統計運算   求最大值      求最小值      平均值   方差