日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

iOS_数据库3_sqlite3基本操作

發布時間:2023/12/16 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS_数据库3_sqlite3基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

終于效果圖:
Sqlite3函數總結?
1.打開數據庫 int sqlite3_open(const char *filename, // 數據庫的文件路徑sqlite3 **ppDb // 數據庫實例 );2.運行不論什么SQL語句 int sqlite3_exec(sqlite3*, // 一個打開的數據庫實例const char *sql, // 須要運行的SQL語句int (*callback)(void*,int,char**,char**), // SQL語句運行完成后的回調void *, // 回調函數的第1個參數char **errmsg // 錯誤信息 );3.檢查SQL語句的合法性(查詢前的準備) int sqlite3_prepare_v2(sqlite3 *db, // 數據庫實例const char *zSql, // 須要檢查的SQL語句int nByte, // SQL語句的最大字節長度sqlite3_stmt **ppStmt, // sqlite3_stmt實例,用來獲得數據庫數據const char **pzTail );4.查詢一行數據 int sqlite3_step(sqlite3_stmt*); // 假設查詢到一行數據,就會返回SQLITE_ROW5.利用stmt獲得某一字段的值(字段的下標從0開始) double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點數據 int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據 const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據 const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串數據










控制器中直接寫SQL語句,未封裝 // // ViewController.m // 1.sqlite3基本操作 // // Created by xss on 14-11-2. // Copyright (c) 2014年 beyond. All rights reserved. //#import "ViewController.h" // 1.導入庫,2.加入主頭文件 #import <sqlite3.h> @interface ViewController () {// db代表著整個數據庫。db是數據庫實例sqlite3 *_db; } @end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 0.獲得沙盒中的數據庫文件名稱NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];NSLog(@"filePath:%@",filename);/*2014-11-02 18:32:38.895 1.sqlite3基本操作[85356:245858] filePath:/Users/juns/Library/Developer/CoreSimulator/Devices/3198E002-E3C9-4523-983E-AC3E1283A654/data/Containers/Data/Application/E1150608-3EB8-4B9D-87AF-33EDF9FB6FF3/Documents/student.sqlite2014-11-02 18:32:38.896 1.sqlite3基本操作[85356:245858] 成功打開數據庫2014-11-02 18:32:38.897 1.sqlite3基本操作[85356:245858] 成功創建t_student表*/// 1.創建(打開)數據庫(假設是首次打開,則數據庫文件不存在。那么會自己主動創建)// OC字符串,直接轉成C語言字符串,通過 UTF8String方法int result = sqlite3_open(filename.UTF8String, &_db);if (result == SQLITE_OK) {NSLog(@"成功打開數據庫");// 2.創表const char *sql = "create table if not exists t_student (id integer primary key autoincrement, name text, age integer);";// 凡是要傳地址的,最好先清空,防止出現野指針,C語言中空是NULLchar *errorMesg = NULL;// 參數3和4是回調時用int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);if (result == SQLITE_OK) {NSLog(@"成功創建t_student表");} else {NSLog(@"創建t_student表失敗:%s", errorMesg);}} else {NSLog(@"打開數據庫失敗");} }// 全然仿造createTable操作 - (IBAction)insertBtnClicked:(UIButton *)sender {for (int i = 0; i<30; i++) {NSString *name = [NSString stringWithFormat:@"beyond-%d", arc4random()%100];int age = arc4random()%100;NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age) values('%@', %d);", name, age];char *errorMesg = NULL;int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);if (result == SQLITE_OK) {NSLog(@"成功加入數據");} else {NSLog(@"加入數據失敗:%s", errorMesg);}} } // 方法同上 - (IBAction)deleteBtnClicked:(UIButton *)sender { } // 方法同上 - (IBAction)updateBtnClicked:(UIButton *)sender { } // - (IBAction)queryBtnClicked:(UIButton *)sender {// SQL注入漏洞/**登錄功能1.用戶輸入賬號和password* 賬號:123' or 1 = 1 or '' = '* password:4566546792.拿到用戶輸入的賬號和password去數據庫查詢(查詢有沒有這個用戶名和password)select * from t_user where username = '123' and password = '456';select * from t_user where username = '123' and password = '456';*/// 1.定義sql語句const char *sql = "select id, name, age from t_student where name = ?;";// 2.定義一個stmt存放結果集,用于運行靜態 SQL 語句并返回它所生成結果的對象sqlite3_stmt *stmt = NULL;// 3.檢測SQL語句的合法性,參數3是sql語句的長度,僅僅要寫-1,會自己主動計算,參數4是statement存放結果集int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);if (result == SQLITE_OK){NSLog(@"查詢語句是合法的");// 設置占位符的內容,參數2 指的是第幾個占位符號,注意是從1開始;參數4是占位符的長度,僅僅要寫-1,會自己主動計算,sqlite3_bind_text(stmt, 1, "beyond", -1, NULL);// 4.step 運行SQL語句,從結果集中取出數據// int stepResult = sqlite3_step(stmt);// step的運行結果等于SQLITE_ROW,表示真的查詢到一行數據while (sqlite3_step(stmt) == SQLITE_ROW){// 獲得這行相應的數據,結果存放在statement中// 獲得第0列的idint sid = sqlite3_column_int(stmt, 0);// 獲得第1列的nameconst unsigned char *sname = sqlite3_column_text(stmt, 1);// 獲得第2列的ageint sage = sqlite3_column_int(stmt, 2);NSLog(@"%d %s %d", sid, sname, sage);}} else {NSLog(@"查詢語句非合法");} } @end

使用工具類封裝 模型 // // Student.h // 2_數據庫工具類封裝 // // Created by xss on 14-11-2. // Copyright (c) 2014年 beyond. All rights reserved. //#import <Foundation/Foundation.h>@interface Student : NSObject // 學號 @property (nonatomic, assign) int ID; // 姓名 @property (nonatomic, copy) NSString *name; // 年齡 @property (nonatomic, assign) int age; @end

工具類StudentDAO // // StudentDAO.h // 2_數據庫工具類封裝 // // Created by xss on 14-11-2. // Copyright (c) 2014年 beyond. All rights reserved. // 學生數據的CRUD(增刪改查)#import <Foundation/Foundation.h> @class Student; @interface StudentDAO : NSObject /*** 加入學生** @param student 須要加入的學生*/ + (BOOL)addStudent:(Student *)student;/*** 獲得全部的學生** @return 數組中裝著都是IWStudent模型*/ + (NSArray *)students;/*** 依據搜索條件獲得相應的學生** @param condition 搜索條件*/ + (NSArray *)studentsWithCondition:(NSString *)condition; @end

關鍵封裝的代碼 // // StudentDAO.m // 2_數據庫工具類封裝 // // Created by xss on 14-11-2. // Copyright (c) 2014年 beyond. All rights reserved. //#import "StudentDAO.h" #import "Student.h" #import <sqlite3.h> @implementation StudentDAO// 重點~~~~加上static的作用:能保證_db這個變量僅僅被StudentDAO.m內部訪問 static sqlite3 *_db; // 重點~~~~工具類第一次載入的時候調用initialize方法 + (void)initialize {// 0.獲得沙盒中的數據庫文件名稱NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];// 1.創建(打開)數據庫(假設數據庫文件不存在。會自己主動創建)int result = sqlite3_open(filename.UTF8String, &_db);if (result == SQLITE_OK) {NSLog(@"成功打開數據庫");// 2.創表const char *sql = "create table if not exists t_student (id integer primary key autoincrement, name text, age integer);";char *errorMesg = NULL;int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);if (result == SQLITE_OK) {NSLog(@"成功創建t_student表");} else {NSLog(@"創建t_student表失敗:%s", errorMesg);}} else {NSLog(@"打開數據庫失敗");}for (int i = 0; i<30; i++) {NSString *name = [NSString stringWithFormat:@"beyond-%d", arc4random()%100];int age = arc4random()%100;NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age) values('%@', %d);", name, age];char *errorMesg = NULL;int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);if (result == SQLITE_OK) {NSLog(@"成功加入數據");} else {NSLog(@"加入數據失敗:%s", errorMesg);}}}+ (BOOL)addStudent:(Student *)student {// Sqlite3中全部的字符串必須用單引號NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age) values('%@', %d);", student.name, student.age];char *errorMesg = NULL;// 兩個NULL代表的是回調方法,此處不須要int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);return result == SQLITE_OK; } // 返回全部的學生對象組成的數組 + (NSArray *)students {// 0.定義數組NSMutableArray *students = nil;// 1.定義sql語句const char *sql = "select id, name, age from t_student;";// 2.定義一個stmt存放結果集sqlite3_stmt *stmt = NULL;// 3.檢測SQL語句的合法性int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"查詢語句是合法的");students = [NSMutableArray array];// 4.運行SQL語句,從結果集中取出數據while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查詢到一行數據// 獲得這行相應的數據Student *student = [[Student alloc] init];// 獲得第0列的idstudent.ID = sqlite3_column_int(stmt, 0);// 獲得第1列的nameconst unsigned char *sname = sqlite3_column_text(stmt, 1);student.name = [NSString stringWithUTF8String:(const char *)sname];// 獲得第2列的agestudent.age = sqlite3_column_int(stmt, 2);// 加入到數組[students addObject:student];}} else {NSLog(@"查詢語句非合法");}return students; } // 模糊查詢 + (NSArray *)studentsWithCondition:(NSString *)condition {// 0.定義數組NSMutableArray *students = nil;// 1.定義sql語句 帶模糊查詢 '%林%'const char *sql = "select id, name, age from t_student where name like ?

;"; // 2.定義一個stmt存放結果集 sqlite3_stmt *stmt = NULL; // 3.檢測SQL語句的合法性 int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL); if (result == SQLITE_OK) { NSLog(@"查詢語句是合法的"); students = [NSMutableArray array]; // 填補占位符的內容,%在OC中是keyword,因此轉義 NSString *newCondition = [NSString stringWithFormat:@"%%%@%%", condition]; sqlite3_bind_text(stmt, 1, newCondition.UTF8String, -1, NULL); // 4.運行SQL語句,從結果集中取出數據 while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查詢到一行數據 // 獲得這行相應的數據 Student *student = [[Student alloc] init]; // 獲得第0列的id student.ID = sqlite3_column_int(stmt, 0); // 獲得第1列的name const unsigned char *sname = sqlite3_column_text(stmt, 1); student.name = [NSString stringWithUTF8String:(const char *)sname]; // 獲得第2列的age student.age = sqlite3_column_int(stmt, 2); // 加入到數組 [students addObject:student]; } } else { NSLog(@"查詢語句非法"); } return students; } @end



控制器中使用工具類為tableView提供數據源,而且監聽搜索框的模糊查詢? // // ViewController.m // 2_數據庫工具類封裝 // // Created by xss on 14-11-2. // Copyright (c) 2014年 beyond. All rights reserved. //#import "ViewController.h" #import "Student.h" #import "StudentDAO.h" @interface ViewController ()<UISearchBarDelegate> // 從數據庫中返回的封裝好的對象數組,為tableView提供數據源 @property (nonatomic, strong) NSArray *students; @end@implementation ViewController#pragma mark - 懶載入 - (NSArray *)students {if (_students == nil) {_students = [StudentDAO students];}return _students; }- (void)viewDidLoad {[super viewDidLoad];// 加入一個搜索框,并設置代理UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];searchBar.delegate = self;// headViewself.tableView.tableHeaderView = searchBar; }#pragma mark - 搜索框代理 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {// 直接覆蓋原來的對象數組self.students = [StudentDAO studentsWithCondition:searchText];// 刷新表格[self.tableView reloadData]; }#pragma mark - tableView代理方法 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return self.students.count; }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {// 1.創建cellstatic NSString *ID = @"student";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];}// 2.設置cell的數據Student *stu = self.students[indexPath.row];cell.textLabel.text = stu.name;cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", stu.age];return cell; }- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {[self.view endEditing:YES]; } @end















版權聲明:本文博主原創文章,博客,未經同意不得轉載。





本文轉自mfrbuaa博客園博客,原文鏈接:http://www.cnblogs.com/mfrbuaa/p/4865134.html,如需轉載請自行聯系原作者


總結

以上是生活随笔為你收集整理的iOS_数据库3_sqlite3基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。