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 スタッターなし) ブロッキング操作を行うことができます。このメソッドは 1 回だけ呼び出されるため、アプリケーションの現在の実行中にデータベース作成コードが複数回呼び出されることはありません。

通常、コードは次のようになります。メソッド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 に答える