1.Sqlite的簡介
Sqlite是嵌入式的關(guān)系型數(shù)據(jù)庫,其特點(diǎn)如下:
1)它是基于c語言開發(fā)的數(shù)據(jù)庫,libsqlite3框架是基于c語言開發(fā)的。
2)在ios中要使用c語言對(duì)數(shù)據(jù)庫進(jìn)行操作。
3)sqlite采用的是動(dòng)態(tài)數(shù)據(jù)類型,值的數(shù)據(jù)類型與值本身相關(guān),與它的容器無關(guān)
2.iOS中使用sqlite的步驟
1)打開數(shù)據(jù)庫,利用sqlite3_open()打開數(shù)據(jù)庫。
用sqlite3_open()打開數(shù)據(jù)庫會(huì)指定一個(gè)數(shù)據(jù)庫文件的保存路徑,如果文件存在則直接打開,否則創(chuàng)建病打開。打開數(shù)據(jù)庫會(huì)得到一個(gè)sqlite3類型的的對(duì)象,以后借助這個(gè)對(duì)象進(jìn)行其他操作。
2)執(zhí)行sql語句,進(jìn)行增刪改查。
執(zhí)行sql語句包括有返回值的語句和無返回值的語句。對(duì)于無返回值的語句(例:增刪改),通過sqlite3_exec()函數(shù)執(zhí)行。對(duì)于有返回值的語句,首先用sqlite3_prepare_v2()進(jìn)行語法檢測,然后通過sqlite3_step()依次取出查詢結(jié)果的每一行數(shù)據(jù),可以使用sqlite3_column_類型()方法獲得對(duì)應(yīng)列的數(shù)據(jù),反復(fù)循環(huán)直到遍歷完成,最后釋放句柄。
在整個(gè)操作過程中無需管理數(shù)據(jù)庫連接,對(duì)于嵌入式SQLite操作是持久連接(盡管可以通過sqlite3_close()關(guān)閉),不需要開發(fā)人員自己釋放連接。
3.實(shí)際使用幾個(gè)函數(shù)。
1)向工程中添加libsqlite3的框架。(libsqlite3.0dylib與libsqlite3.dylib的區(qū)別:libsqlite3.0.dylib是個(gè)鏈接,他指向libsqlite3.dylib,兩者本質(zhì)相同。不過libsqlite3.0.dylib總是指向最新的sqlite3動(dòng)態(tài)庫,比如sqlite3更新了,如果我們引用libsqlite3.0.dylib,就不需要修改了。)
2)打開數(shù)據(jù)庫(都封裝為共有的方法)
-(openDB)
{
//獲取數(shù)據(jù)庫路徑.NSDocumentDirectory:說明獲取document的文件夾目錄, NSUserDomainMask:在當(dāng)前沙盒中獲取
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documents = [paths objectAtIndex:0];
//設(shè)置數(shù)據(jù)庫的路徑。
NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];(dbname是常變量)
//如果有數(shù)據(jù)庫則直接打開,否則創(chuàng)建并打開(注意database_path是ObjC中的字符串,需要轉(zhuǎn)化為C語言字符串類型)
if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK) {
return YES;
}else{
return NO;
NSLog(@”數(shù)據(jù)庫打開失敗”);
sqlite3_close(db);
}
}//創(chuàng)建并打開數(shù)據(jù)庫
2)執(zhí)行
11.沒有返回值
- (void)createDB{
//sql 語句
NSString *sqlCreateTable =? [NSString stringWithFormat:@”CREATE TABLE IF NOT EXISTS ‘%@’ (‘%@’ INTEGER PRIMARY KEY AUTOINCREMENT, ‘%@’ TEXT, ‘%@’ INTEGER, ‘%@’ TEXT)”,TABLENAME,ID,NAME,AGE,ADDRESS];
[self execSql:sqlCreateTable];
}
-(void) insertData{
NSString *insertSql1= [NSString stringWithFormat:
@”INSERT INTO ‘%@’ (‘%@’, ‘%@’, ‘%@’) VALUES (‘%@’, ‘%@’, ‘%@’)”,
TABLENAME, NAME, AGE, ADDRESS, @”張三”, @”13”, @”濟(jì)南”];
[self execSql:insertSql1];
NSString *insertSql2 = [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"濟(jì)南"];
[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)execSql:(NSString *)sql
{
if ([self openDB]) {
char *err;
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
NSLog(@”數(shù)據(jù)庫操作數(shù)據(jù)失敗!”);
}else{
NSLog(@”%@”,sql);
?????????? }
sqlite3_close(db);
??? }
}
22.有返回值的
-(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) {
//查詢結(jié)果集中一條一條的遍歷所有的記錄,這里的數(shù)字對(duì)應(yīng)的是列值,注意這里的列值
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);
}