SQLite (http://www.sqlite.org/docs.html) 是一個輕量級的關係數據庫。SQLite最初的設計目標是用於嵌入式系統,它佔用資源非常少,在嵌入式設備中,只需要幾百K的內存就夠了,目前應用於Android、iOS、Windows Phone等智能手機。iOS 使用時SQLite,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 頭文件即可。
數據庫操作包含打開數據庫、創建表,表的增、刪、改、查。下面代碼給出了數據庫操作。
創建並打開數據庫:
-(BOOL) openDB{
//獲取數據庫路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documents = [paths objectAtIndex:0];
NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];
//如果數據庫存在,則用sqlite3_open直接打開(不要擔心,如果數據庫不存在sqlite3_open會自動創建)
//打開數據庫,這裏的[path UTF8String]是將NSString轉換爲C字符串,因爲SQLite3是採用可移植的C(而不是
//Objective-C)編寫的,它不知道什麼是NSString.
if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK) {
return YES;
}else{
return NO;
NSLog(@"數據庫打開失敗");
sqlite3_close(db);
}
}
iOS中沒有提供創建數據庫的命令,當使用sqlite3_open時,如果數據庫文件不存在會自行創建數據庫,如果存在會打開數據庫。打開數據庫後就可以創建表並操作表內容了,iOS中的sqlite3使用sqlite3_exec來創建表、插入表內容、修改表內容、刪除表內容等操作,使用sqlite3_prepare_v2來查詢表。下面給給出了sqlite3_exec的封裝:
-(void)execSql:(NSString *)sql
{
if ([self openDB]) {
char *err;
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
NSLog(@"數據庫操作數據失敗!");
}else{
NSLog(@"%@",sql);
}
sqlite3_close(db);
}
}
創建表:
-(void) insertData{
NSString *insertSql1= [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
TABLENAME, NAME, AGE, ADDRESS, @"張三", @"13", @"濟南"];
[self execSql:insertSql1];
NSString *insertSql2 = [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"濟南"];
[self execSql:insertSql2];
}
修改表:
-(void) updateData{
NSString *updateSql = [NSString stringWithFormat:
@"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",
TABLENAME, AGE, @"15" ,AGE, @"13"];
[self execSql:updateSql];
}
刪除表內容:
-(void) deleteData{
NSString *sdeleteSql = [NSString stringWithFormat:
@"delete from %@ where %@ = '%@'",
TABLENAME, NAME, @"張三"];
[self execSql:sdeleteSql];
}
上面實現了表內容的增、改、刪,下面實現表內容查詢。
-(void) selectData{
[self openDB];
NSString *sqlQuery = [NSString stringWithFormat:
@"SELECT * FROM %@",TABLENAME];
sqlite3_stmt * statement;
if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
//查詢結果集中一條一條的遍歷所有的記錄,這裏的數字對應的是列值,注意這裏的列值
while (sqlite3_step(statement) == SQLITE_ROW) {
char *name = (char*)sqlite3_column_text(statement, 1);
NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name];
int age = sqlite3_column_int(statement, 2);
char *address = (char*)sqlite3_column_text(statement, 3);
NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];
NSLog(@"name:%@ age:%d address:%@",nsNameStr,age, nsAddressStr);
}
}else{
NSLog(@"select error:%@",sqlQuery);
}
sqlite3_close(db);
}
好了,這就是全部了,iOS中數據庫操作的類封裝的並不太好用,希望大家儘量封裝自己的類,。