LocalStorage还是SQLite?

时间:2012-10-24 10:42:20

标签: iphone objective-c ios xcode sqlite

我正在处理我的应用程序,让我将我的在线DVD信息存储在我的i​​phone上。只是想知道使用localStorage或SQLite。此外,我将来会更新我的应用程序,我不想丢失我存储的数据。你建议我哪一个?

干杯

3 个答案:

答案 0 :(得分:2)

  

我在线DVD的信息

可以是大型信息,然后使用核心数据或SQLite。

  

此外我将来会更新我的应用程序而且我不想放弃我的应用程序   存储数据

如果您在不删除旧版本的情况下进行更新,则SQLite数据仍然存在。这也适用于NSUserDefault。您可以使用Keychains进行永久数据存储,但需要使用少量数据。如果不了解更多有关您的要求,不能多说。

答案 1 :(得分:1)

我对localStograge了解不多,无论如何SQLite会给你很好的选择:

  1. Android便携版
  2. 可以在不丢失以前数据库的情况下进行更新。
  3. 这是init 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);
    }
    

答案 2 :(得分:0)

使用WebSQL的唯一原因(我认为这是SQLite的意思)是因为你确实需要重的关系功能。不仅是某个字段的索引,而且表和复杂查询之间存在显着的交叉引用。否则你将得到补充支持和弃用的地狱。还有IndexedDB,但它不是SQL替代品,支持也不完整,API足以限制任何人的大脑。

至少localStorage甚至可以在旧的锡盒上工作,如果你通过类似http://rhaboo.org之类的东西与它交谈,那么它相当友好。