【问题标题】:Handling very large databases in iOS在 iOS 中处理非常大的数据库
【发布时间】:2014-10-13 07:12:09
【问题描述】:

我想知道如何在 iOS 中处理非常大的数据库?

解释:

我正在为公司制作一个应用程序,它将保存所有日常交易和操作(这意味着每天几百到几千)。 该应用程序实际上只显示日常事务,但将所有内容保存在数据库中以防万一(所以我无法删除它们)。

由于应用程序需要具有高反应性,我正在寻找一种方法来有效地加载(核心数据提取)最新的操作,而从长远来看,当数据库变得非常大时不会减慢速度。 知道无论何时更新操作,我都会立即刷新显示的表格。

我在 iOS 上找不到任何与此相关的文章,因此我找不到任何好的做法或正确的处理方法。

在 MySQL 服务器上,我会这样做: * 为日常“活动”操作设置数据库,完成后,删除它们并将它们移动到“已完成”操作数据库。 * 设置一个 Cron 作业以在晚上转储/备份每日/每月数据库,并在第二天拥有一个全新的轻量级数据库。

遗憾的是,似乎无法在 iOS 上创建动态表,甚至创建“已完成”的数据库,这仍然需要在每次关闭操作时访问繁重的数据库,这可能导致内存不足崩溃。

【问题讨论】:

    标签: ios core-data ios7


    【解决方案1】:

    实际上,我认为您可以尝试使用 sqlite api 来匹配 MySQL 服务器中的相同操作。但是,您将不得不删除 CoreData 并改写所有内容,即 TableView、TableCell 等。 像这样处理数据源:

    sqlite3 * tradeDB;
    sqlite3_open_v2([path UTF8String], &tradeDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nil);
    sqlite3_stmt * recordset;
    int res = sqlite3_prepare_v2(tradeDB, "select count(*) from someTable", -1, &recordset, nil);
    if (res!=SQLITE_OK) {
        return nil;
    }//end if
    
    res = sqlite3_step(recordset);
    if (res!=SQLITE_ROW) {
        _result = nil;
    }else{
        char * res_char = (char*)sqlite3_column_text(recordset, 0);
        if (!res_char)
            _result = nil;
        else
            _result = [NSString stringWithUTF8String:res_char];
        //end if
    }//end if
    sqlite3_finalize(recordset);
    
    if (!_result) {
        _result = @"0";
    }//end if
    return self;
    

    【讨论】:

    • 我建议如果res 不等于SQLITE_OK(对于sqlite3_prepare_v2)或不等于SQLITE_ROWSQLITE_DONE(对于sqlite3_step),你应该查看错误消息(例如NSLog(@"error: %s", sqlite3_errmsg(tradeDB));)。否则,您将无法成功诊断您可能遇到的任何问题。
    • 是的,我刚刚发布了一个演示。我希望它简短而简单,以最好地表达自己。我的原始代码肯定不是那样的。 :-)
    • 谢谢,其实我很怕直接和sqlite打交道,不过好像没那么糟糕。希望我有一个单独的控制器方法来管理与 CoreData 之间的所有操作,所以只需要更新这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多