一、前言
數據庫作為一種數據載體被我們頻繁地使用。一般情況下我們會在程序的入口方法處完成數據庫的創建。下面通過實例簡單介紹兩種創建數據庫的方法。
二、需求
在documents目錄下創建一個test.sqlite數據庫,裡面包含表User。User表含username和password兩個varchar類型的字段。
方法一:使用SQLiteManager創建數據庫和表,並將創建好的數據庫文件拖入項目中,最後調用以下代碼將數據庫復制到documents目錄;
/**
* 將數據庫文件復制進沙盒
*/
-(void)createEditableCopyOfDatabaseIfNeeded
{
// 先判斷 sandbox 下面的 documents 子文件夾裡面有沒有數據庫文件 test.sqlite
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"test.sqlite"];
BOOL ifFind = [fileManager fileExistsAtPath:writableDBPath];
if (ifFind)
{
// NSLog(@"數據庫已存在");
return;
}
else{
NSLog(@"數據庫不存在,需要復制");
}
// 如果不存在數據庫文件,則復制數據庫文件
NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"sqlite"];
BOOL ifSuccess = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!ifSuccess) {
NSLog(@"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}else {
NSLog(@"createEditableCopyOfDatabaseIfNeeded 初始化成功");
}
return;
}
方法二:利用開源的FMDB庫代碼創建數據庫;
/**
* 代碼創建數據庫
*/
- (void)createDatabaseIfNeeded
{
// 數據庫路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *doc = [paths objectAtIndex:0];
NSString *path = [doc stringByAppendingPathComponent:@"test.sqlite"];
NSFileManager * fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path] == NO) {
// create it
FMDatabase * db = [FMDatabase databaseWithPath:path];
if ([db open]) {
// 建立User表
NSMutableString *sql = [NSMutableString stringWithFormat:@"%@",@"CREATE TABLE User"];
[sql appendString:@"("];
[sql appendString:@"username varchar,"];
[sql appendString:@"password varchar"];
[sql appendString:@")"];
BOOL res = [db executeUpdate:sql];
if (!res) {
debugLog(@"error when creating table User");
} else {
debugLog(@"succ to creating table User");
}
[db close];
}
else {
debugLog(@"error when open db");
}
}
}
注:FMDB庫使用教程http://blog.devtang.com/blog/2012/04/22/use-fmdb/
1、第一種方法創建數據庫在需求變動的情況下(如增加幾張表)容錯率稍高,推薦使用第一種方法;
2、兩種方法均是先判斷數據庫是否存在然後再決定要不要創建/復制數據庫。在一種特殊情況下-應用更新版本,其實原來的數據庫文件是會從老的版本中拷貝到新版本中(參考:http://blog.csdn.net/zyx586/article/details/18989199),所以更新版本後數據庫文件是不會做任何改變的,就算你在新的版本中完全改變數據庫的結構。所以如果存在數據庫變動的需要在應用版本升級後重新創建一個全新的數據庫並備份舊的數據;