简介:iOS开发的持久化数据存储有4种方式:NSUserDefault和.plist、NSKeyedArchiver和NSKeyedUnarchiver、sqlite3数据库、CoreData。
sqlite3和CoreData适合存储大量数据(内容数据等),而另外两种适合存储简单数据(语言,字体,标记等简单数据存储)。
准备:这里主要介绍利用sqlite3封装的FMDatabase的数据库,(当然还有PlausibleDatabase、sqlitepersistentobjects等其他封装的库),导入需要依赖的libsqlite3.dylib包,FMDatabase已经根据工程不同情况兼容ARC和非ARC。为了只针对数据库进行讲解,直接创建一个简单工程,导入FMDatabase库。
内容:1.创建数据库
#import<UIKit/UIKit.h>#import"FMDatabase.h"#import"FMDatabaseQueue.h"@interfaceViewController : UIViewController{
FMDatabase*db;
FMDatabaseQueue*queue_db;
}
//创建数据库文件路径- (NSString*)getPath{
NSArray* paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) ;return[[paths objectAtIndex:0]stringByAppendingPathComponent:@"TEST.sqlite"] ;
}
2.数据库的建表-增-删-改操作
- (void)viewDidLoad {
[super viewDidLoad];
[self executeSql:[self createTable]];//创表[self executeSql:[self insertData]];//增[self executeSql:[self deleteData]];//删[self executeSql:[self setData]];//改//查[self queryData];//开辟多线程[NSThread detachNewThreadSelector:@selector(multipleThread) toTarget:self withObject:nil];
}
//创建数据库-(NSString *)createTable{
NSString*createSql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS TEST(a interger,b text)"];returncreateSql;
}//增- (NSString *)insertData{
NSString*insertSql=[NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@') VALUES ('%@', '%@')",@"TEST",@"a",@"b", [NSNumber numberWithInt:1],@"宁波"];returninsertSql;
}//删- (NSString *)deleteData{
NSString*deleteSql = [NSString stringWithFormat:@"DELETE FROM '%@' where %@ = '%@'",@"TEST",@"b",@"宁波"];returndeleteSql;
}//改-(NSString *)setData{
NSString*setSql = [NSString stringWithFormat:@"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",@"TEST",@"b",@"象山",@"a", [NSNumber numberWithInt:1]];returnsetSql;
}
3.数据库的执行操作
//数据库执行操作-(BOOL)executeSql:(NSString *)sql{
db=[FMDatabase databaseWithPath:[self getPath]];
BOOL success;if([db open]) {
success=[db executeUpdate:sql];
}else{
NSLog(@"OPEN FAIL");
}
[db close];returnsuccess;
}
4.数据库的查询操作
//查-(void)queryData{if([db open]) {
NSString*querySql =[NSString stringWithFormat:@"SELECT * FROM %@",@"TEST"];
FMResultSet* rs =[db executeQuery:querySql];while([rs next]) {inta = [rs intForColumn:@"a"];
NSString*b = [rs stringForColumn:@"b"];
NSLog(@"a:%d == b:%@",a,b);
}
[db close];
}
}
5.数据库的多线程操作
若在多线程的环境下,不能在多线程中共用同一个FMDatabase进行数据访问,会造成数据混乱,多线程下不能用单例对象,这时得依靠FMDatabaseQueue。
//多线程下使用FMDatabaseQueue进行数据库操作-(void)multipleThread{
queue_db=[FMDatabaseQueue databaseQueueWithPath:[self getPath]];
@autoreleasepool{
[queue_db inDatabase:^(FMDatabase *db2) {
[db2 executeUpdate:[self insertData]];
[self queryData];
}];
}
}