IOS / SQLite:Where / Where是创建数据库的最佳时间

时间:2012-04-17 19:09:55

标签: ios sqlite initialization create-table

我目前正在将我的sqllite数据库包含到我的应用程序中,我一直想知道什么时候是应用程序生命周期中创建表的最佳时间(或检查它们是否存在)。

在我读过的大多数例子中,作者都​​是这样的:

- (void)viewDidLoad
{
    NSString *docsDir;
    NSArray *dirPaths;

    // Get the documents directory
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    docsDir = [dirPaths objectAtIndex:0];

    // Build the path to the database file
    databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]];

    NSFileManager *filemgr = [NSFileManager defaultManager];

    if ([filemgr fileExistsAtPath: databasePath ] == NO)
    {
        const char *dbpath = [databasePath UTF8String];

        if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
        {
            char *errMsg;
            const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)";

            if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
            {
                status.text = @"Failed to create table";
            }

            sqlite3_close(contactDB);

        } else {
            status.text = @"Failed to open/create database";
        }
    }

    [filemgr release];
    [super viewDidLoad];

}

但是如果viewDidLoad是创建它的基础位置,我一直在游荡。 在初始化应用程序期间创建它会更好吗?

这更像是一个什么是最佳实践的问题,而不是因为我目前的代码工作得很好^^

感谢您的意见

杰森

2 个答案:

答案 0 :(得分:1)

我建议你转移到CoreData进行数据管理,你也可以通过在Xcode中创建一个新的应用程序轻松回答你的问题,然后点击CoreData复选框,然后检查AppDelegate以查看持久存储的位置(以及如何)创建

答案 1 :(得分:1)

初始化模型的最佳位置是在您的app委托中。 iOS Springboard会为您的启动画面设置动画并显示它,直到您的应用委托的application:didFinishLaunchingWithOptions:返回,这样您就可以在没有用户注意到它们的情况下进行阻止操作(没有UI口吃)。 此方法只调用一次,因此您可以确保在应用程序当前运行期间不会多次调用数据库创建代码。

代码通常如下所示,给你一个DataModel单例类,当你通过第一次调用sharedModel方法初始化它的实例时初始化数据库:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [DataModel sharedModel];

    // Initialize your window and root view controller...

    return YES;
}