1、在Firefox中打開sqlite3(若是沒有,選擇工具->附加組件,添加便可)新建sqlite3數據庫,Contacts,sql
創建一個members表,字段 id,integer,主鍵,自增;name,varchar;email,varchar,null;birthday,datetime,null。數據庫
向表中添加一些數據:函數
2、新建Empty Appliation,添加一個HomeViewController,和一個組件libsqlite3.dylib,來支持對sqlite3的鏈接,關閉,增刪改查等操做。工具
1. HomeViewController.h代碼:spa
#import <UIKit/UIKit.h>
#import "sqlite3.h"
@interface HomeViewController : UIViewController{
sqlite3 *db; //聲明一個sqlite3數據庫
}
- (NSString *)filePath;//數據庫文件的路徑。通常在沙箱的Documents裏邊操做
@end
2. HomeViewController.m代碼: 操作系統
#import "HomeViewController.h"orm
@interface HomeViewController ()
@end
@implementation HomeViewController
//該方法用於返回數據庫在Documents文件夾中的全路徑信息 sqlite
- (NSString *)filePath{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"Contacts.sqlite"];
}
//打開數據庫的方法 blog
- (void)openDB{
if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) {
sqlite3_close(db);
NSAssert(0, @"數據庫打開失敗。");
}
}
//插入數據方法
- (void)insertRecordIntoTableName:(NSString *)tableName
withField1:(NSString *)field1 field1Value:(NSString *)field1Value
andField2:(NSString *)field2 field2Value:(NSString *)field2Value
andField3:(NSString *)field3 field3Value:(NSString *)field3Value{
/*方法1:經典方法
NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES('%@', '%@', '%@')", tableName, field1, field2, field3, field1Value, field2Value, field3Value];
char *err;
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
sqlite3_close(db);
NSAssert(0, @"插入數據錯誤!");
}
*/
//方法2:變量的綁定方法 內存
NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",tableName, field1, field2, field3];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
sqlite3_bind_text(statement, 1, [field1Value UTF8String], -1,NULL);
sqlite3_bind_text(statement, 2, [field2Value UTF8String], -1,NULL);
sqlite3_bind_text(statement, 3, [field3Value UTF8String], -1,NULL);
}
if (sqlite3_step(statement) != SQLITE_DONE) {
NSAssert(0, @"插入數據失敗!");
sqlite3_finalize(statement);
}
}
//查詢數據
- (void)getAllContacts{
NSString *sql = @"SELECT * FROM members";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *name = (char *)sqlite3_column_text(statement, 0);
NSString *nameStr = [[NSString alloc] initWithUTF8String:name];
char *email = (char *)sqlite3_column_text(statement, 1);
NSString *emailStr = [[NSString alloc] initWithUTF8String:email];
char *birthday = (char *)sqlite3_column_text(statement, 2);
NSString *birthdayStr = [[NSString alloc] initWithUTF8String:birthday];
NSString *info = [[NSString alloc] initWithFormat:@"%@ - %@ - %@",
nameStr, emailStr, birthdayStr];
NSLog(info);
[nameStr release];
[emailStr release];
[birthdayStr release];
[info release];
}
sqlite3_finalize(statement);
}
}
- (void)viewDidLoad
{
[self openDB];
[self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李1" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
[self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李2" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
[self insertRecordIntoTableName:@"members" withField1:@"name" field1Value:@"李3" andField2:@"email" field2Value:@"df@qq.com" andField3:@"birthday" field3Value:@"12-45-78"];
[self getAllContacts];
sqlite3_close(db);
[super viewDidLoad];
}
@end
插入數據後的效果:
查詢的效果:
3、小結:
1.數據查詢:sqlite3_exec()函數執行sql語句,在沒有返回值的狀況下(好比建立表格、插入記錄、刪除記錄等操做中)很好用。
也會用到sqlite3_stat結構、sqlite3_prepare_v2()函數、sqlte3_step()函數和sqlite3_finalize()函數。
查詢分三個階段:準備階段:sqlite3_stat、sqlite3_prepare_v2()
執行階段:sqlte3_step()
終止階段: sqlite3_finalize()
2.附表:
sqlite3數據庫打開時的返回值及其所表明的含義
返回值 |
描述 |
返回值 |
描述 |
SQLITE_OK=0 |
返回成功 |
SQLITE_FULL=13 |
數據庫滿,插入失敗 |
SQLITE_ERROR=1 |
Sql錯誤或錯誤的數據庫 |
SQLITE_CANTOPEN=14 |
不能打開數據庫文件 |
SQLITE_INTERNAL=2 |
Sqlite的內部邏輯錯誤 |
SQLITE_PROTOCOL=15 |
數據庫鎖定協議錯誤 |
SQLITE_PERM=3 |
拒絕訪問 |
SQLITE_EMPTY=16 |
數據庫表爲空 |
SQLITE_ABORT=4 |
回調函數請求中斷 |
SQLITE_SCHEMA=17 |
數據庫模式改變 |
SQLITE_BUSY=5 |
數據庫文件被鎖 |
SQLITE_TOOBIG=18 |
一個表數據行過多 |
SQLITE_LOCKED=6 |
數據庫中的一個表被鎖 |
SQLITE_CONSTRAINT=19 |
因爲約束衝突而停止 |
SQLITE_NOMEN=7 |
內存分配失敗 |
SQLITE_MISMATCH=20 |
數據類型不匹配 |
SQLITE_READONLY=8 |
試圖對一個只讀數據庫進行寫操做 |
SQLITE_MISUSE=21 |
數據庫錯誤使用 |
SQLITE_INTERRUPT=9 |
由sqlite_interrupt()結束操做 |
SQLITE_NOLFS=22 |
使用主機操做系統不支持的特性 |
SQLITE_IOERR=10 |
磁盤I/O發生錯誤 |
SQLITE_AUTH=23 |
非法受權 |
SQLITE_CORRUPT=11 |
數據庫磁盤鏡像畸形 |
SQLITE_FORMAT=24 |
輔助數據庫格式錯誤 |
SQLITE_NOTFOUND=12 |
(Internal Only)表或記錄不存在 |
SQLITE_NOTADB=26 |
打開的不是一個數據庫文件 |