一、創(chuàng)建數(shù)據(jù)庫(kù)及表
//打開數(shù)據(jù)庫(kù) 如果沒有就創(chuàng)建
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"data.sqlite"];// 數(shù)據(jù)庫(kù)名字也可以不帶后綴
NSLog(@"%@",path);
int success = sqlite3_open(path.UTF8String, &_db);
if (success == SQLITE_OK) {
NSLog(@"創(chuàng)建數(shù)據(jù)庫(kù)成功!");
//2.創(chuàng)建表 (指定字段 -> 需求: 保存 學(xué)生信息 id name score)
//用sql語(yǔ)句 來創(chuàng)建
//編寫sql語(yǔ)句
NSString *str = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL NOT NULL)";
//執(zhí)行sql語(yǔ)句
int success_t = sqlite3_exec(_db, str.UTF8String, NULL, NULL, NULL);
if (success_t == SQLITE_OK) {
NSLog(@"創(chuàng)建表成功!");
}else{
NSLog(@"創(chuàng)建表失敗!");
}
}else{
NSLog(@"創(chuàng)建數(shù)據(jù)庫(kù)失敗!");
}
二场靴、向數(shù)據(jù)庫(kù)添加數(shù)據(jù)
//3.增加 數(shù)據(jù) (100條 數(shù)據(jù)隨機(jī))
for (int i = 0; i <100; i++) {
NSString *strName = [NSString stringWithFormat:@"changyou-%d",i];
NSString *sqlStr = [NSString stringWithFormat:@"INSERT INTO t_student (name ,score)VALUES('%@',%.02f)",strName,arc4random_uniform(1000)/10.0];
//執(zhí)行
int success = sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, NULL);
if (success == SQLITE_OK) {
NSLog(@"添加成功!");
}else{
NSLog(@"添加失敗!");
}
}
三啡莉、刪除數(shù)據(jù)
//4.刪除 數(shù)據(jù) (70 - 80 分?jǐn)?shù))
NSString *sqlStr = @"DELETE FROM t_student WHERE score > 80.0";
//執(zhí)行
int success = sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, NULL);
if (success == SQLITE_OK) {
NSLog(@"刪除成功!");
}else{
NSLog(@"刪除失敗!");
}
四、修改數(shù)據(jù)
//5.修改 數(shù)據(jù) (修改分?jǐn)?shù)小于60.0為60.0)
NSString *sqlStr = @"UPDATE t_student SET score = 60.0 WHERE score < 60.0";
//執(zhí)行
int success = sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, NULL);
if (success == SQLITE_OK) {
NSLog(@"修改成功!");
}else{
NSLog(@"修改失敗!");
}
五旨剥、查詢數(shù)據(jù)
//6.查詢數(shù)據(jù) ( score >= 60)
//NSString *sqlStr = @"SELECT * FROM t_student WHERE score > 60.0 ORDER BY score DESC;";
//查詢數(shù)據(jù) ( name 中帶 you 數(shù)字)
NSString *sqlStr = @"SELECT * FROM t_student WHERE name LIKE '%you%'";
//查詢之后 把結(jié)果放在 stmt對(duì)象
// 保存所有的結(jié)果集
sqlite3_stmt *stmt = nil;
sqlite3_prepare_v2(_db, sqlStr.UTF8String, -1, &stmt, NULL);
//獲取到所有結(jié)果 每一步 查詢到一條記錄
while (sqlite3_step(stmt) == SQLITE_ROW) {
//取出一條記錄
// name TEXT column
const unsigned char * name = sqlite3_column_text(stmt, 1);
NSString *strName = [NSString stringWithCString:(const char *)name encoding:NSUTF8StringEncoding];
//score REAL
double score = sqlite3_column_double(stmt, 2);
NSLog(@"name = %@ score = %f",strName,score);
}
六咧欣、關(guān)閉數(shù)據(jù)庫(kù)
// 關(guān)閉數(shù)據(jù)庫(kù)
// 數(shù)據(jù)庫(kù)在合適位置關(guān)閉,根據(jù)需要轨帜,靈活掌握
//sqlite3_close(_db);
七魄咕、第三方類庫(kù)FMDB
FMDatabase這個(gè)類是線程不安全的,如果在多個(gè)線程中同時(shí)使用一個(gè)FMDatabase實(shí)例蚌父,會(huì)造成數(shù)據(jù)混亂等問題
為了保證線程安全哮兰,F(xiàn)MDB提供方便快捷的FMDatabaseQueue類
FMDatabaseQueue的創(chuàng)建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
八、附:
1.打開數(shù)據(jù)庫(kù)
int sqlite3_open(
const char *filename, // 數(shù)據(jù)庫(kù)的文件路徑
sqlite3 **ppDb // 數(shù)據(jù)庫(kù)實(shí)例
);
2.執(zhí)行任何SQL語(yǔ)句
int sqlite3_exec(
sqlite3*, // 一個(gè)打開的數(shù)據(jù)庫(kù)實(shí)例
const char *sql, // 需要執(zhí)行的SQL語(yǔ)句
int (*callback)(void*,int,char**,char**), // SQL語(yǔ)句執(zhí)行完畢后的回調(diào)
void *, // 回調(diào)函數(shù)的第1個(gè)參數(shù)
char **errmsg // 錯(cuò)誤信息
);
3.檢查SQL語(yǔ)句的合法性(查詢前的準(zhǔn)備)
int sqlite3_prepare_v2(
sqlite3 *db, // 數(shù)據(jù)庫(kù)實(shí)例
const char *zSql, // 需要檢查的SQL語(yǔ)句
int nByte, // SQL語(yǔ)句的最大字節(jié)長(zhǎng)度
sqlite3_stmt **ppStmt, // sqlite3_stmt實(shí)例苟弛,用來獲得數(shù)據(jù)庫(kù)數(shù)據(jù)
const char **pzTail
);
4.查詢一行數(shù)據(jù)
int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行數(shù)據(jù)喝滞,就會(huì)返回SQLITE_ROW
5.利用stmt獲得某一字段的值(字段的下標(biāo)從0開始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點(diǎn)數(shù)據(jù)
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數(shù)據(jù)
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長(zhǎng)整型數(shù)據(jù)
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進(jìn)制文本數(shù)據(jù)
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串?dāng)?shù)據(jù)