【问题标题】:Question about SQLite3 and updating iPhone app关于 SQLite3 和更新 iPhone 应用程序的问题
【发布时间】:2011-06-30 04:28:39
【问题描述】:

考虑以下场景。

我在应用商店中有一个 iPhone 应用,它对 16 列 SQLite3 表执行查询。作为更新,我想在此表中添加一个新列。

当有人安装更新时,它会搞砸吗?桌子会换吗?这是如何运作的。我该如何处理?

【问题讨论】:

  • 由于 sqlite 3 不支持添加列,您需要重命名旧表,创建一个包含所有列的新表,包括新表,然后从旧表填充新表,然后最后删除旧表。
  • 您是否 100% 确定它不起作用?因为我很确定它确实......
  • 它确实有效...我在我的应用程序中安装了一个没有该列的数据库。它添加了一列。它确实有效,因为第二次没有添加它。
  • 哦,是的,抱歉,我对我过去的经历感到困惑......事情是由于添加列的某些限制,我遇到了问题,主要是处理新的外键,以及排序列,从那时起,我就一直按照我前面提到的程序进行操作 - 再次抱歉,打扰了。
  • 那么在安装应用程序后我的数据库会被完全替换吗?制作应用程序时,我将数据库拖到“框架”文件夹中。我担心它会完全取代旧数据库。

标签: iphone ios sqlite


【解决方案1】:

一种方法是在启动时检查表是否具有新字段。您可以使用以下 SQLite 命令从表中检索所有字段

PRAGMA table_info(table-name);

如果您要查找的字段不在结果集中,请执行ALTER TABLE table-name ADD COLUMN column-name column-type 以更新您的表。

您可以使用此方法循环遍历表的字段

- (BOOL)getFields
{
    const char *sql = "PRAGMA table_info(myTable)";
    sqlite3_stmt *stmt;

    if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK)
    {
        return NO;
    }

    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        NSString *fieldName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
        NSLog(@"%@", fieldName);
    }

    return YES;
}

希望对你有帮助

【讨论】:

  • 能否提供更多“从表中检索所有字段”的代码?
  • 我想检查是否存在名为“Apple”的列
  • 我已经用一种循环遍历字段的方法更新了答案
  • @WTP SQLite 3.1.4 及以上版本支持adding columns
  • 3.1.4 已经出 6 年了,WTP。 :)
【解决方案2】:

仅供参考,如果您从未复制数据库使其可编辑,它将被替换。如果您将数据库复制到可写的地方,那么您必须自己处理替换。

【讨论】:

  • 什么意思?当我第一次制作应用程序时,我将数据库拖到了我的框架文件夹中。它会在更新中被替换吗?
  • 这正是 David Hodge 刚刚回答的。您没有复制,因此将被替换。
  • 您提交时简单包含在应用程序中的任何内容都会被更新替换。在 iOS 中,您的 app bundle 是只读的,旨在准确包含您通过最新更新提交给 Apple 的内容。因此,对您而言,这意味着您将拥有最新的数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多