一、sqlite简介。
在ios中,大量的数据存储必然会用到数据库,而默认支持的数据库就是sqlite3这一轻量级数据库,sqlite是广泛应用在移动开发和嵌入式领域的关系型数据库。因为sqlite是由大概3万行C代码写成的,所以ios还是提供了一些接口来直接操作数据库的。
二、sqlite准备活动。
引入framework: libsqlite3.0.dylib。我们发现又两个库文件名很相似,libsqlite3.0.dylib和libsqlite3.dylib,首先说一下他们的差别。
这个文件结构很明显,libsqlite3.0.dylib是一个指向libsqlite3.dylib的链接,之所以有这样一个链接是因为libsqlite3.0.dylib指向的是最新的sqlite库文件,如果库文件有更新,哪天出了个>libsqlite3.5.dylib,如果我们引入工程的是链接的话,就不需要修改,直接会引用到最新的库文件。
然后在数据库操作的类里面,#import <sqlite3.h> 或者 #import"/usr/include/sqlite3.h" 。
三、sqlite操作
1. 数据库打开与关闭。
- (BOOL)openDatabase
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths objectAtIndex:0];
NSString *dbPath = [documentPath stringByAppendingPathComponent:DBNAME];
if (sqlite3_open([dbPath UTF8String], &_db) != SQLITE_OK) {
sqlite3_close(_db);
NSLog(@"Can not open data base.");
return NO;
}
return YES;
}
sqlite3_close(_db);
创建的方法也是这个,数据库在打开的时候如果发现没有这个文件,那么会创建一个新的。
2. 创建表结构
NSString *createTable = @"CREATE TABLE IF NOT EXISTS person_info (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)";
[self execSql:createTable];
- (void)execSql:(NSString *)sql
{
char *error;
int state = sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &error);
if (state == SQLITE_OK) {
NSLog(@"Success to exec: %s", [sql UTF8String]);
sqlite3_close(_db);
} else {
NSLog(@"Failed to exec: %@. \nError: %@", sql, [NSString stringWithCString:error encoding:NSUTF8StringEncoding]);
sqlite3_free(error);
sqlite3_close(_db);
}
}
3. 插入数据
- (BOOL)insertRecordWithName:(NSString *)name age:(NSInteger)age address:(NSString *)address
{
[self openDatabase];
NSString *data1 = [NSString stringWithFormat:@"INSERT INTO '%@' (name,age,address) VALUES (?,?,?);", TABLENAME];
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(_db, [data1 UTF8String], -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2, [[NSString stringWithFormat:@"%i", age] UTF8String], -1, nil);
sqlite3_bind_text(stmt, 3, [address UTF8String], -1, nil);
}
if (sqlite3_step(stmt) == SQLITE_DONE) {
sqlite3_finalize(stmt);
NSLog(@"Success to exec: %@", [NSString stringWithFormat:@"INSERT INTO '%@' (name,age,address) VALUES (%@,%i,%@);", TABLENAME, name, age, address]);
sqlite3_close(_db);
return YES;
}
return NO;
}
4. 查询数据
- (NSArray *)queryWith:(NSString *)name
{
[self openDatabase];
NSString *querySql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE name = ?", TABLENAME];
sqlite3_stmt *stmt;
NSMutableArray *resultArray = [NSMutableArray array];
if (sqlite3_prepare(_db, [querySql UTF8String], -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
while (sqlite3_step(stmt) == SQLITE_ROW) {
char *name = (char *)sqlite3_column_text(stmt, 1);
NSString *nameString = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
int age = sqlite3_column_int(stmt, 2);
NSString *ageString = [NSString stringWithFormat:@"%i", age];
char *address = (char *)sqlite3_column_text(stmt, 3);
NSString *addressString = [NSString stringWithCString:address encoding:NSUTF8StringEncoding];
[resultArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:nameString, @"name", ageString, @"age", addressString, @"address", nil]];
}
NSLog(@"Success to exec: %@", [NSString stringWithFormat:@"SELECT * FROM %@ WHERE name = %@", TABLENAME, name]);
} else {
return nil;
}
sqlite3_finalize(stmt);
sqlite3_close(_db);
return resultArray;
}
5. 删除数据
- (BOOL)deleteWith:(NSString *)name
{
[self openDatabase];
NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE name = ?", TABLENAME];
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [name UTF8String], -1, nil);
}
if (sqlite3_step(stmt) == SQLITE_DONE) {
sqlite3_finalize(stmt);
NSLog(@"Success to exec: %@", [NSString stringWithFormat:@"DELETE FROM %@ WHERE name = %@", TABLENAME, name]);
sqlite3_close(_db);
return YES;
}
return NO;
}
至于更新数据,也就是sql语句的差别了,别的都一样。
基本数据库的操作就这些了,根据实际应用可以封装一下方法,方便调用。
OK,Done.
所有数据存储的例子:http://download.youkuaiyun.com/detail/wanghuafeng123456/5891439