1.SQL
SQL是Structured Query Language(結(jié)構(gòu)化查詢語(yǔ)言)的縮寫(xiě)。SQL是專為數(shù)據(jù)庫(kù)而建立的操作命令集,是一種功能齊全的數(shù)據(jù)庫(kù)語(yǔ)言。
2.常見(jiàn)的數(shù)據(jù)庫(kù)
- My SQL:MySQL是一個(gè)精巧的SQL數(shù)據(jù)庫(kù)管理系統(tǒng),而且是開(kāi)源的數(shù)據(jù)管理系統(tǒng)。其主要目標(biāo)是快速、健壯和易用。由于它的強(qiáng)大功能、靈活性、豐富的應(yīng)用編程接口(API)以及精巧的系統(tǒng)結(jié)構(gòu),受到了廣大自由軟件愛(ài)好者甚至是商業(yè)軟件用戶的青睞。
- Oracle:Oracle Database,又名Oracle RDBMS,或簡(jiǎn)稱Oracle。是甲骨文公司的一款跨關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。系統(tǒng)可移植性好、使用方便、功能強(qiáng)。
3.數(shù)據(jù)庫(kù)特征:
- 以一定方式存儲(chǔ)在一起
- 能為多個(gè)用戶共享
- 具有盡可能少的冗余代碼
- 與程序彼此獨(dú)立的數(shù)據(jù)集合
4.什么是數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)(DataBase)是按照數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù)
5.數(shù)據(jù)庫(kù)分類
關(guān)系型數(shù)據(jù)庫(kù)(主流)、對(duì)象型數(shù)據(jù)庫(kù)、層次式數(shù)據(jù)庫(kù)
6.常用關(guān)系型數(shù)據(jù)庫(kù)
PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase
嵌入式、移動(dòng)客戶端:SQLite
7.SQLite
- SQLite是一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù)。SQLite最初的設(shè)計(jì)目標(biāo)是用于嵌入式系統(tǒng),它占用資源非常少,在嵌入式設(shè)備中,只需要幾百K的內(nèi)存就夠了,Android、iOS、Windows Phone等智能手機(jī)。iOS使用SQLite時(shí),只需要加入libsqlite3.0.tbd庫(kù)以及引入sqlite3.h頭文件即可。
- SQLite是無(wú)類型的數(shù)據(jù)庫(kù),可以保存任何類型的數(shù)據(jù),對(duì)于SQLite來(lái)說(shuō)對(duì)字段不指定類型是完全有效的
(注:良好的編程習(xí)慣應(yīng)該要為字段標(biāo)注類型)
為了使sqlite和其他數(shù)據(jù)庫(kù)間的兼容性最大化,sqlite支持“類型近似”的觀點(diǎn)。列的類型近似指的是存儲(chǔ)在列上數(shù)據(jù)的推薦類型。
8.表
表是數(shù)據(jù)庫(kù)中一個(gè)非常重要的對(duì)象,是其他對(duì)象的基礎(chǔ)。根據(jù)信息的分類情況,一個(gè)數(shù)據(jù)庫(kù)中可能包含若干個(gè)數(shù)據(jù)表。

9.字段
表的“列”稱為“字段”,每個(gè)字段包含某一專題的信息

10.記錄
記錄是指對(duì)應(yīng)于數(shù)據(jù)表中一行信息的一組完整的相關(guān)信息

------------------------------DataBaseHandle.h------------------------------
#import<Foundation/Foundation.h>
@interface DataBaseHandle : NSObject
//單例
+(DataBaseHandle *)sharedDataBaseHandle;//方法命名時(shí)會(huì)有一些約定俗成的規(guī)則.這些規(guī)則不是官方規(guī)定的,一般以shared或default開(kāi)頭,后面是類名
//打開(kāi)數(shù)據(jù)庫(kù)
-(void)openDB;
//關(guān)閉數(shù)據(jù)庫(kù)
-(void)closeDB;
//創(chuàng)建表
-(void)createTable;
//插入一條數(shù)據(jù)
-(void)insertName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age;
//通過(guò)UID更新一條數(shù)據(jù)
-(void)updateWithUID:(NSInteger)uid;
//通過(guò)UID刪除一條數(shù)據(jù)
-(void)deleteWithUID:(NSInteger)uid;
//搜索全部
-(void)searchAll;
//通過(guò)name查詢一條數(shù)據(jù)
-(void)searchWithName:(NSString *)name;
@end
------------------------------DataBaseHandle.m-----------------------------
#import "DataBaseHandle.h"
//sqlite的頭文件
#import<sqlite3.h>
@interface DataBaseHandle()
//document文件夾下的一個(gè)叫做person.sqlite的文件
@property(nonatomic,copy)NSString *dbPath;
@end
static DataBaseHandle *dataBase = nil;
@implementation DataBaseHandle
//單例
+(DataBaseHandle *)sharedDataBaseHandle
{
if (dataBase == nil)
{
dataBase = [[DataBaseHandle alloc] init];
}
return dataBase;
}
//懶加載
-(NSString *)dbPath
{
if (_dbPath == nil) {
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
_dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"];
}
return _dbPath;
}
//初始化一個(gè)數(shù)據(jù)庫(kù)
static sqlite3 *db = nil;
//打開(kāi)數(shù)據(jù)庫(kù)
-(void)openDB
{
//打開(kāi)數(shù)據(jù)庫(kù)的函數(shù)
//在數(shù)據(jù)庫(kù)里面 所有的字符串都要變成utf-8的編碼格式
int result = sqlite3_open(self.dbPath.UTF8String, &db);
if (result == SQLITE_OK)
{
NSLog(@"打開(kāi)成功");
}
else
{
NSLog(@"打開(kāi)失敗");
}
}
//關(guān)閉數(shù)據(jù)庫(kù)
-(void)closeDB
{
int result = sqlite3_close(db);
if (result == SQLITE_OK)
{
NSLog(@"關(guān)閉成功");
}
else
{
NSLog(@"關(guān)閉失敗 %d",result);
}
}
//創(chuàng)建表
-(void)createTable
{
//創(chuàng)建一個(gè)person表,要求字段:UID integer 主鍵,自增 name text,gender text,age integer
//創(chuàng)建表的sql語(yǔ)句
NSString *creatString = @"create table if not exists person(uid integer primary key autoincrement not null,name text,gender text,age integer)";
//第一個(gè)參數(shù):數(shù)據(jù)庫(kù)
//第二個(gè)參數(shù):sql語(yǔ)句,要用utf-8的格式
//第三個(gè)參數(shù):結(jié)果的回調(diào)函數(shù)
//第四個(gè)參數(shù):回調(diào)函數(shù)的參數(shù)
//第五個(gè)參數(shù):錯(cuò)誤信息
int result = sqlite3_exec(db, creatString.UTF8String, NULL, NULL, NULL);
//判斷是否創(chuàng)建成功
if (result == SQLITE_OK)
{
NSLog(@"創(chuàng)建表成功");
}
else
{
NSLog(@"創(chuàng)建表失敗 %d",result);
}
//打印數(shù)據(jù)庫(kù)的地址
NSLog(@"_dbPath ==== %@",_dbPath);
}
//插入一條數(shù)據(jù)
-(void)insertName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
{
//插入數(shù)據(jù)的sql語(yǔ)句,數(shù)據(jù)不確定,所以在values里面使用?代替,之后向里面綁定
NSString *insertString = @"insert into person(name,gender,age)values(?,?,?)";
//sqlite的伴隨指針
sqlite3_stmt *stmt = nil;
//預(yù)執(zhí)行sql語(yǔ)句
//第一個(gè)參數(shù):數(shù)據(jù)庫(kù)
//第二個(gè)參數(shù):sql語(yǔ)句
//第三個(gè)參數(shù):如果為正,例如:1,表示在取參數(shù)的時(shí)候,只取一個(gè)字節(jié);使用負(fù)數(shù)表示取值取到碰到結(jié)束符號(hào)('\000','u000')
//第四個(gè)參數(shù):伴隨指針,會(huì)隨著數(shù)據(jù)庫(kù)的操作,獲取值或綁定值
//第五個(gè)參數(shù):取值的時(shí)候如果取的不全,那么剩下的都存在這里
int result = sqlite3_prepare(db, insertString.UTF8String, -1, &stmt, NULL);
//如果預(yù)執(zhí)行成功的話,那么就要往里面存數(shù)據(jù)了
if (result == SQLITE_OK)
{
//向預(yù)執(zhí)行的sql語(yǔ)句里面插入?yún)?shù)(取代'?'的位置)
//第一個(gè)參數(shù):伴隨指針
//第二個(gè)參數(shù):'?'的位置,從1開(kāi)始
//第三個(gè)參數(shù):插入的數(shù)據(jù)
//第四個(gè)參數(shù):和上面的-1是一樣的
//第五個(gè)參數(shù):回調(diào)函數(shù)
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);
sqlite3_bind_int64(stmt, 3, age);
//sql語(yǔ)句已經(jīng)全了
//執(zhí)行伴隨指針,如果為SQLITE_DONE 代表執(zhí)行成功,并且成功地插入數(shù)據(jù)
if (sqlite3_step(stmt) == SQLITE_DONE)
{
NSLog(@"插入成功");
}
else
{
NSLog(@"插入失敗");
}
}
else
{
NSLog(@"%d",result);
}
//一定要記得釋放掉伴隨指針
sqlite3_finalize(stmt);
}
//通過(guò)UID更新一條數(shù)據(jù)
-(void)updateWithUID:(NSInteger)uid
{
NSString *updateString = @"update person set name = '王軍' where uid = ?";
//伴隨指針
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(db, updateString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK)
{
sqlite3_bind_int64(stmt, 1, uid);
if (sqlite3_step(stmt) == SQLITE_DONE)
{
NSLog(@"修改成功");
}
}
sqlite3_finalize(stmt);
}
//通過(guò)UID刪除一條數(shù)據(jù)
//簡(jiǎn)單的操作方式
-(void)deleteWithUID:(NSInteger)uid
{
NSString *deleteString = [NSString stringWithFormat:@"delete from person where uid = %ld",uid];
int result = sqlite3_exec(db, deleteString.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK)
{
NSLog(@"刪除成功");
}
else
{
NSLog(@"刪除失敗");
}
}
//搜索全部
-(void)searchAll
{
NSString *searchString = @"select * from person";
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(db, searchString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK)
{
//當(dāng)sqlite3_step(stmt) == SQLITE_ROW 的時(shí)候,代表還有下一條數(shù)據(jù)
while (sqlite3_step(stmt) == SQLITE_ROW)
{
//第二個(gè)參數(shù):表示參數(shù)的位置,從0開(kāi)始
int uid = sqlite3_column_int(stmt, 0);
NSString *name = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1)];
NSString *gender = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 2)];
int age = sqlite3_column_int(stmt, 3);
NSLog(@"uid = %d,name = %@,gender = %@,age = %d",uid,name,gender,age);
}
}
sqlite3_finalize(stmt);
}
//通過(guò)name查詢一條數(shù)據(jù)
-(void)searchWithName:(NSString *)name
{
NSString *searchString = @"select uid,gender,age from person where name = ?";
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(db, searchString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK)
{
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
while (sqlite3_step(stmt) == SQLITE_ROW)
{
int uid = sqlite3_column_int(stmt, 0);
NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
int age = sqlite3_column_int(stmt, 2);
NSLog(@"uid = %d,gender = %@,age = %d",uid,gender,age);
}
}
else
{
NSLog(@"result ==== %d", result);
}
sqlite3_finalize(stmt);
}
@end
------------------------------ViewController.m-----------------------------
#import "ViewController.h"
#import "DataBaseHandle.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
DataBaseHandle *dataBase = [DataBaseHandle sharedDataBaseHandle];
[dataBase openDB];
[dataBase createTable];
// [dataBase insertName:@"王得梁" gender:@"女" age:40];
// [dataBase deleteWithUID:23];
[dataBase searchWithName:@"王得梁"];
[dataBase updateWithUID:24];
[dataBase searchAll];
[dataBase closeDB];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
