0

我目前正在将我的 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 是创建它的基础位置,我会一直徘徊。在应用程序初始化期间创建会更好吗?

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

感谢您的意见

杰森

4

2 回答 2

1

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

于 2012-04-17T20:04:42.080 回答
1

初始化模型的最佳位置是在您的应用程序委托中。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;
}
于 2012-04-17T20:21:27.453 回答