最近有这么一个需求,数据库初始的时候就已经有一个表中有数据了,这导致我们之前在程序运行的时候,再在本地创建数据库的方案不能使用了.因为程序运行时,再创建数据库和表,肯定都是空的.如果要有数据,就必须写n多条的插入语句.最终,我们觉得把已经创建好的数据库,放到工程文件,Supporting Files 中.然后在程序运行的时候,把数据库移动到本地,作为本地数据库使用.
// SQLManager.h
#import <Foundation/Foundation.h>
@interface SQLManager : NSObject
+ (instancetype)sharedMapSQLite;
- (NSArray *)totalGroupOfT_cityWithNameSort:(NSString *)nameSort;
// SQLManager.m
#import "SQLManager.h"
#import "FMDB.h"
@interface SQLManager ()
@property (nonatomic, strong) FMDatabaseQueue* queue;
@implementation SQLManager
+ (instancetype)sharedSQLManager {
static SQLManager* manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[MapSQLite alloc] init];
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingPathComponent:@"list.db"];
NSData *data=[NSData dataWithContentsOfFile:path];
if (!data) {
NSString *backupDbPath = [[NSBundle mainBundle]
pathForResource:@"list"
ofType:@"db"];
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error;
BOOL cp = [fm copyItemAtPath:backupDbPath toPath:path error:&error];
NSLog(@"%@",error);
}
manager.queue = [FMDatabaseQueue databaseQueueWithPath:path];
NSLog(@"path == %@",path);
});
return manager;
}
//根据传入的字母主键 返回主键所在色数组
- (NSArray *)totalGroupOfT_cityWithNameSort:(NSString *)nameSort
{
NSString* loadStatement = @"SELECT * FROM T_city WHERE nameSort = ?;";
NSMutableArray *arrayM = [NSMutableArray array];
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
FMResultSet* result = [db executeQuery:loadStatement withArgumentsInArray:@[nameSort]];
while ([result next]) {
NSString *strgroup = [result stringForColumn:@"CityName"];
[arrayM addObject:strgroup];
}
}];
return arrayM.copy;
}
// 调用
SQLManager *manager = [SQLManager sharedMapSQLite];
NSArray *array = [manager totalGroupOfT_cityWithNameSort:@"A"];
NSLog(@"%@",array);
原文:http://my.oschina.net/u/2418942/blog/529804