IOS學習筆記15——SQLite數據庫
SQLite是MySQL的簡化版,更多的運用與移動設備或小型設備上。SQLite的優點是具有可移植性,它不需要服務器就能運行,同時,它也存在一些缺陷,首先,沒有提供簡單的數據庫創建方式,必須手工創建數據庫,其次,SQLite沒有面向對象接口,必須使用依賴于C語言代碼的API。相對于OC,這套API既不那么優雅,也更難使用。當相比于用文件進行存儲,還是更推薦使用SQLite進行數據存儲。
下面來看下如何使用SQLite
工程目錄如下:
首先建立一個Single View Application工程,命名為SQLite3Test,然后打開ViewController.xib文件,布局如下,并設置三個UITextField的tag分別為1、2、3
設置tag的地方在屬性選擇器中(xcode右邊)
然后在ViewController.h文件中聲明如下:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property(copy,nonatomic) NSString *databaseFilePath;
//這個方法定義的是當應用程序退到后臺時將執行的方法,按下home鍵執行(通知中心來調度)
-(void)applicationWillResignActive:(NSNotification *)notification;
//當通過鍵盤在UITextField中輸入完畢后,點擊屏幕空白區域關閉鍵盤的操作
-(IBAction)backgroundTapped:(id)sender;
@end
接下來看下.m文件的具體實現,就不一一介紹了,在代碼中會有注釋
在開始寫代碼前,要導入SQLite支持包 libsqlite3.dylib(具體做法就不詳述了)
上代碼:
#import "ViewController.h"
#import "sqlite3.h"
//數據庫文件的名字
#define kDatabaseName @"database.sqlite3"
@interfaceViewController ()
@end
@implementation ViewController
@synthesize databaseFilePath;
- (void)viewDidLoad
{
[superviewDidLoad];
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [path objectAtIndex:0];
//指定數據庫文件的路徑
self.databaseFilePath = [documentDirectory stringByAppendingPathComponent:kDatabaseName];
//打開數據庫
sqlite3 *database;
//[self.databaseFilePath UTF8String];將OC字符串裝換成C字符串
if (sqlite3_open([self.databaseFilePathUTF8String], &database) != SQLITE_OK) {
//關閉數據庫
sqlite3_close(database);
NSAssert(0,@"數據庫打開失敗");
}
//創建表格
NSString *createSql = @"CREATE TABLE IF NOT EXISTS STUDENT (TAG INTEGER PRIMARY KEY ,FIELD_DATA TEXT);";
//若發生錯誤,則錯誤信息存在該字符串中
char *errorMsg;
//sqlite3_exec這個方法可以執行那些沒有返回結果的操作,例如創建、插入、刪除等,這個函數包含了sqlite3_prepare這個函數的操作,目的是將UTF-8格式的SQL語句轉換為編譯后的語句
if (sqlite3_exec(database, [createSql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0,@"創建表錯誤:%s", errorMsg);
}
//查詢數據庫
NSString *querySql = @"SELECT * FROM STUDENT ORDER BY TAG";
//語句句柄
sqlite3_stmt *statament;
//sqlite3_prepare_v2的作用是將UTF-8格式的SQL語句轉換為編譯后的語句,并返回指向該語句的指針
if (sqlite3_prepare_v2(database, [querySql UTF8String], -1, &statament, nil) == SQLITE_OK) {
//sqlite3_step的作用是在編譯后的語句中向前移動一條記錄,SQLITE_ROW代表一行
while (sqlite3_step(statament) == SQLITE_ROW) {
//返回當前這條記錄中的一個int類型字段的值,下面sqlite3_column_text返回一個字符串類型的值,后面的數字對應每一列
int tag = sqlite3_column_int(statament, 1);
char *rowData = (char *)sqlite3_column_text(statament, 2);
//如果要得到一個NSString字符串,可以采用如下方法
//NSString *str = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statament, 1)];
//通過tag得到UI控件,類似Android中的findViewById(id)
UITextField *textField = (UITextField *)[self.viewviewWithTag:tag];
//[[NSString alloc]initWithUTF8String:rowData] 將C字符串轉換成OC字符串
textField.text = [[NSStringalloc]initWithUTF8String:rowData];
}
//刪除編譯后的語句
sqlite3_finalize(statament);
}
sqlite3_close(database);
//注冊通知,當程序將要退到后臺時執行applicationWillResignActive方法(在.h中定義)
UIApplication *application = [UIApplicationsharedApplication];
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotificationobject:application];
}
- (void)viewDidUnload
{
[superviewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
//按下Home鍵程序將要進入后臺前保存UITextField中的數據
-(void)applicationWillResignActive:(NSNotification *)notification
{
sqlite3 *database;
if (sqlite3_open([self.databaseFilePathUTF8String], &database) != SQLITE_OK) {
NSAssert(0,@"打開數據庫錯誤");
sqlite3_close(database);
}
for (int i = 1; i <= 3; i++) {
UITextField *textField = (UITextField *)[self.viewviewWithTag:i];
//插入數據
char *update = "INSERT OR REPLACE INTO STUDENT VALUES (?,?)";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK) {
//將值保存到指定的列
sqlite3_bind_int(statement, 1, i);
//第四個參數代表第三個參數中需要傳遞的長度。對于C字符串來說,-1表示傳遞全部字符串。第五個參數是一個回調函數,比如執行后做內存清除工作。
sqlite3_bind_text(statement, 2, [textField.textUTF8String], -1, NULL);
}
char *errorMsg = NULL;
//SQLITE_DONE代表更新數據庫是否完成
if (sqlite3_step(statement) != SQLITE_DONE) {
NSAssert(0,@"更新數據出錯:%s",errorMsg);
}
sqlite3_finalize(statement);
}
sqlite3_close(database);
}
-(IBAction)backgroundTapped:(id)sender
{
/*當通過鍵盤在UITextField中輸入完畢后,點擊屏幕空白區域關閉鍵盤的操作
設置步驟是打開.xib文件選中整個視圖,然后將屬性選擇器中的class由UIView改成UIControl,然后在事件選取器中選擇Touch Down事件并連線到.h文件中的backgroundTapped方法
*/
for (int i = 1; i <= 3; i ++) {
UITextField *textField = (UITextField *)[self.viewviewWithTag:i];
[textField resignFirstResponder];
}
}
@end
最后運行效果如下,輸入信息后按下Home鍵,然后再進入應用,可以看到數據在每次退出前都保存了,再次進入則從sqlite數據庫查詢保存的數據并顯示在界面上
智能推薦
SQLite數據庫
1.SQLite數據庫簡介 SQLite 是一個開源的、內嵌式的關系型數據庫,第一個版本誕生于 2000 年 5 月,目前最高版本為 SQLite3。 學習網站:http://www.runoob.com/sqlite/sqlite-tutorial.html 安裝方法:( 我用的是ubuntu12.04) 字符界面: 圖形界面: SQLite 特性: 零配置 、靈活、可移植、自由的授權、緊湊、可...
SQLite數據庫
Android下的Sqlite數據庫 SQLite,是一款輕型的數據庫,它包含在一個相對小的C庫中。它的設計目標是嵌入式的,而 且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在...
SQLite數據庫
創建表格: CREATE TABLE Users( id INTEGER blabla name VARCHAR(128), email VARCHAR(128) ) CREATE TABLE Course( id INTEGER blabla, %主鍵 cname TEXT ) CREATE TABLE Member...
SQLITE(數據庫)
數據庫 簡介 數據庫(Database)按照數據結構來組織、存儲和管理數據的倉庫,目前市面上常有的數據庫有:SQL Server、Oracle、MySQL(小型數據庫)、DB2(大型數據庫)。 而我們的SQLITE它是一款非常輕量級別的關系數據庫系統,SQLite在使用前不需要安裝設置,不需要進程來啟動、停止或者配置。主要使用于手機應用的數據庫以及小型桌面軟件的數據庫。 SQLITE下載 下載地址...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...