SQLite在我們這些運用過其他數據庫的人手裏,其實根本就不算是數據庫,因爲sqlite實在是太小了,而且sqlite中的數據類型 (name text, age integer, phoneNo text)都是假的,只是爲了和其他數據庫一樣操作而已!下面是SQLite中經常運用的操作語句
– 創建數據表,定義存儲數據信息表的結構
–CREATE TABLE T_Student (name text, age integer, phoneNo text);
– 刪除數據表,通常在上需要使用某一個表的時候,纔會用到,日常開發中極少會用到此命令
–DROP TABLE T_Student;
– 新增數據內容,在SQL語句中,字符串需要用單引號引起
– 插入語句的語法格式:
– INSERT INTO 表吊 (字段1, 字段2, …) VALUES (字段1數值, 字段2數值, …)
– INSERT INTO T_Person (name, age, gender, height) VALUES ('小花1', 20, 1, 1.62);
– 更新數據庫內容
– 更新所有記錄
– UPDATE T_Person SET name = '王二麻子';
– 條件修改 WHERE (要修改、操作的記錄在哪裏)
– UPDATE T_Person SET name = '小芳' WHERE gender = 1;
– 使用AND可以設置與條件
– 使用OR可以設置或條件
– 更新記錄的語法格式
– UPDATE 表吊 SET 字段1 = 字段1數值, 字段2 = 字段2數值, … WHERE 要修改的條件
– UPDATE T_Person SET name = '西門吹雪', age = 45 WHERE age = 60 AND height = 1.65;
– UPDATE T_Person SET name = '悟空' WHERE age = 18 OR height = 1.72;
– 刪除記錄
– 刪除的語法格式
– DELETE FROM 表吊 WHERE 要刪除的條件
– DELETE FROM T_Person WHERE height = 1.8;
– 查詢指令
– SELECT * FROM T_Person;
– 條件查詢
– 查詢所有的男的
– SELECT * FROM T_Person WHERE gender = 1;
– 查詢年齡大於10歲,同時是男士
– SELECT * FROM T_Person WHERE age > 10 AND gender = 0;
– 查詢Person表中的記錄總數
— SELECT count(*) FROM T_Person;
– 查詢最高的身高
– SELECT max(height) FROM T_Person;
– SELECT min(age) FROM T_Person;
– 查詢所有男士的平均身高
— SELECT avg(height) FROM T_Person WHERE gender = 0;
– 分頁查詢
– 從第0條記錄開始,查詢3條記錄
– LIMIT 的第一個參數表示:從第幾行記錄開始查詢,起始行數是0
– LIMIT 的第二個參數表示:本次查詢需要查詢的記錄數量
– SELECT * FROM T_Person LIMIT 0, 3;
– SELECT * FROM T_Person LIMIT 3, 3;
– SELECT * FROM T_Person LIMIT 6, 3;
– 排序
– ORDER BY 要排序的字段吊
– ASC 表示升序
– DESC 表示降序
– 如果有多個字段參與排序,先排第一個字段,讓後依次類推,即:第一個字段的排序優先級最高!
SELECT height, name, gender, age FROM T_Person ORDER BY age ASC, height DESC;
介紹完上面的基本操作語句之後,我們運用sqlite來做一個實例:
/**
SQLite3使用步驟
名詞解釋:handle句柄,在C語言中,通常把用於控制某類東西的叫做句柄,實際上是一個指針。
通過這個指針就可以達到操作對象的目的。
SQLITE_OK 表示數據庫操作成功
-
先要有一個數據庫,放在Bundle中還是放在沙盒裏?
-
MainBundle是隻讀的,如果是菜譜、中國全史只是看不用修改的可以放在Bundle中
-
如果需要對數據進行操作,數據庫文件應該放在沙盒中!
sqlite3_open 打開數據庫
- 如果數據庫已經存在,直接打開
- 如果數據庫不存在,新建一個空白的數據庫(0KB),然後再打開
-
創建數據表
-
定義數據操作SQL
-
調用sqlite3_exec執行SQL
提示:爲了避免重複建表,可以在建表SQL中增加 IF NOT EXISTS
-
單步執行操作
1> 增加數據
2> 修改數據
3> 刪除數據
定義SQL執行
SQLITE_OK == sqlite3_exec -
查詢語句
1> 準備SQL
2> 檢查SQL語句是否正確 sqlite3_prepare_v2
3> 單步執行,依次獲取查詢到的記錄 SQLITE_ROW == sqlite3_step(stmt
4> 按照查詢順序,依次取出每一個字段的內容sqlite3_column_text 取字符串
sqlite3_column_int 取整數
sqlite3_column_double 取浮點數操作SQLite數據庫需要5個方法
sqlite3_open
sqlite3_execsqlite3_prepare_v2
sqlite3_stepsqlite3_column_text 取字符串
sqlite3_column_int 取整數
sqlite3_column_double 取浮點數
兩個枚舉
SQLITE_OK
SQLITE_ROW
*/
下面是代碼部分,我的pyPerson類就省略了哦!,還有沙盒存儲的sqlite路徑也省略了哦!!!!!
1
|
|
// pyViewController.m
// 010601-SQLite
//
// Created by panyong on 14-1-6.
// Copyright (c) 2014年 panyong. All rights reserved.
//
import “pyViewController.h”
import “NSString+DocDir.h”
import
import “pyPerson.h”
@interface pyViewController ()
{
1
|
sqlite3 *_db; |
}
@end
@implementation pyViewController
-
(void)viewDidLoad
{
[super viewDidLoad];
//創建數據庫
[self createSQLite];//創建數據庫表
[self createTableWithName:@“userInfo”];//添加數據
// 3. 增加個人記錄
// 自己編寫程序,生成隨機的數據,以便在單機開發中測試
// NSArray array = @[@“李四”, @“王五”, @“趙六”, @“劉老頭”];
//
// for (NSInteger i = 0; i < 50; i++) {
// NSString name = [NSString stringWithFormat:@“%@%04d”, array[arc4random_uniform(array.count)], arc4random_uniform(10000)];
// NSInteger age = arc4random_uniform(20) + 18;
// CGFloat height = arc4random_uniform(30) / 100.0f + 1.5f;
//
// pyPerson *p = [pyPerson pyPersonWithID:0 withName:name withGender:1 withAge:age withHeight:height] ;
//
// [self addValue:p];
// }//4查詢數據
[self selectData];
}
pragma mark –創建數據庫
-(void)createSQLite
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//數據庫的路徑 NSString *name = @ "opensqlite.db"
; NSString *docDir = [name NSStringWithDocDir]; //創建數據庫 /**
sqlite3_open
1) 如果數據庫存在,直接打開
2) 如果數據庫不存在,先創建數據庫文件,再打開
*/ //NSLog(@"%@",docDir); _db = NULL; //這裏一定要是const轉換爲常量,因爲這是c語言的庫 if
(SQLITE_OK == sqlite3_open([docDir UTF8String], &_db)) { NSLog(@ "數據庫打開成功" ); } else
{ NSLog(@ "數據庫打開失敗" ); } |
}
//SQLITE_API int sqlite3_exec(
// sqlite3, / An open database /
// const char sql, / SQL to be evaluated /
// int (callback)(void,int,char,char), / Callback function
/
// void , / 1st argument to callback /
// char errmsg / Error msg written here */
//);
pragma mark -添加數據庫表
-(void)createTableWithName:(NSString *)string
{
1
2
3
4
5
6
7
8
9
10
|
// 創建數據庫 T_ 表示的是表的前綴, NSString *sql = @ "CREATE TABLE IF NOT EXISTS T_Person (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, gender INTEGER, age INTEGER, height REAL)" ; //NSString *sql = [NSString stringWithFormat:@"create table '%@'",string]; char
*err = nil ; if
(SQLITE_OK == sqlite3_exec(_db, [sql UTF8String], nil, nil, &err)) { NSLog(@ "創建成功" ); } else { NSLog(@ "數據庫表創建失敗 %s" ,err); } |
}
pragma mark -設置添加數據
-(void)addValue:(pyPerson *)p
{
1
2
3
|
NSString *str = [NSString stringWithFormat:@ "INSERT INTO T_Person (name, gender, age, height) VALUES ('%@', %d, %d, %f)" ,p.name,p.gender,p.age,p.height]; //執行數據 [self sql:str]; |
}
pragma mark -執行方法
-(void)sql:(NSString *)str
{
1
2
3
4
5
6
7
|
char
*err = NULL ; if
(SQLITE_OK == sqlite3_exec(_db, [str UTF8String], nil, nil, &err)) { NSLog(@ "成功插入數據" ); } else { NSLog(@ "插入數據失敗" ); } |
}
pragma mark 查詢數據
-(void)selectData
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
NSMutableArray *arr = Nil ; //1.查詢語句 NSString *sql = @ "select id, name, age, gender, height from T_Person " ; //2.檢測查詢語句是否錯誤 sqlite3_stmt *stmt = Nil ; if
(SQLITE_OK ==sqlite3_prepare_v2(_db, [sql UTF8String], - 1 , &stmt, NULL) ) { //sqlite3_step(stmt)是獲取 while
(SQLITE_ROW == sqlite3_step(stmt)) { NSInteger i = sqlite3_column_int(stmt,
0 ); const
unsigned char
*name = sqlite3_column_text(stmt, 1 );
int age = sqlite3_column_int(stmt,
2 );
int gender = sqlite3_column_int(stmt,
3 );
CGFloat height = sqlite3_column_int(stmt, 4 );
NSString *myname = [NSString stringWithUTF8String:( const
char *)name]; |
// NSLog(@“%@—%d”,myname,age);
1
2
3
4
5
6
7
8
9
|
pyPerson *person = [pyPerson pyPersonWithID:i withName:myname withGender:gender withAge:age withHeight:height]; [arr addObject:person]; NSLog(@ "%@---%d" ,person.name,person.age); } } else { NSLog(@ "語法錯誤" ); } //NSLog(@"%@",arr); |
}