0

オンライン DVD の情報を iPhone に保存できるアプリを開発中です。localStorage や SQLite を使用するのは不思議です。また、将来アプリを更新する予定で、保存したデータを失いたくありません。どれをお勧めしますか?!

乾杯

4

2 に答える 2

2

私のオンライン DVD の情報

大規模な情報になる可能性がある場合は、コア データまたは SQLite を使用します。

また、将来アプリを更新する予定で、保存したデータを失いたくない

古いバージョンを削除せずに更新すると、SQLite データが残ります。これは NSUserDefault でも同じように機能します。キーチェーンは永続的なデータ ストレージに使用できますが、少量のデータに使用できます。あなたの要件についてもっと知らなければ、これ以上言うことはできません。

于 2012-10-24T10:51:01.140 に答える
1

とにかくSQLiteはあなたに良いオプションを提供します:

  1. Androidに移植可能
  2. 以前のデータベースを失うことなく更新できます。

DB を初期化してアップグレードするサンプル コードを次に示します。

+(void) InitalizeDB
{
    NSFileManager   *fileManager = [NSFileManager defaultManager];
    NSError         *error;
    NSString        *dbPath = [self getDBPath];
    BOOL            success = [fileManager fileExistsAtPath:dbPath];

    if(!success) 
    {       
        NSString    *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"QuestionsDB.sqlite"];

        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
        if (!success)
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
    if (success)
    {
        if (sqlite3_open([dbPath UTF8String], &gDatabase) != SQLITE_OK)
        {
            sqlite3_close(gDatabase);
            gDatabase = nil;
        }
    }
    if (gDatabase != nil)
        [self Upgrade];
}

+(void)Upgrade
{
    sqlite3         *NewDatabase = nil;
    NSString        *NewDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"QuestionsDB.sqlite"];
    const char      *szVersion = "SELECT DBVersion FROM Version";
    sqlite3_stmt    *sqlOldVersion;
    sqlite3_stmt    *sqlNewVersion;

    if (sqlite3_open([NewDBPath UTF8String], &NewDatabase) != SQLITE_OK)
    {
        sqlite3_close(NewDatabase);
        NewDatabase = nil;
    }

    if (NewDatabase != nil)
    {
        if (sqlite3_prepare_v2(gDatabase, szVersion, -1, &sqlOldVersion, NULL) != SQLITE_OK)
            NSAssert1(0, @"Failed to compile sql statment %s", sqlite3_errmsg(gDatabase));
        if (sqlite3_prepare_v2(NewDatabase, szVersion, -1, &sqlNewVersion, NULL) != SQLITE_OK)
            NSAssert1(0, @"Failed to compile sql statment %s", sqlite3_errmsg(NewDatabase));
        if (sqlite3_step(sqlOldVersion) == SQLITE_ROW && sqlite3_step(sqlNewVersion) == SQLITE_ROW)
        {
            if (sqlite3_column_int(sqlOldVersion, 0) < sqlite3_column_int(sqlNewVersion, 0))
            {
                [self UpgradeCategories:NewDatabase];
                [self UpgradeQuestions:NewDatabase];
                [self UpgradeQuestionChoices:NewDatabase];
            }
        }
        else 
        {
            NSAssert(0, @"Failed to retreive questions database version.");
        }


    }   
    sqlite3_close(NewDatabase);
}
于 2012-10-24T10:48:11.130 に答える