【问题标题】:Parsing SQL file in Objective-C在 Objective-C 中解析 SQL 文件
【发布时间】:2010-01-18 21:38:32
【问题描述】:

有谁知道一个可以让开发人员轻松解析 SQL 文件的 Objective-C 库?我正在构建一个包含 SQLite 数据库的 iPhone 应用程序,并且我正在尝试使用一个系统来升级用户的可写数据库。在阅读了该站点上的大量问题和答案后,似乎执行 DDL 和 DML 操作的最佳方法是保留将执行必要数据库升级的 SQL 文件列表。所以现在我已经决定要读取应用程序包中的 SQL 文件,然后执行各个 SQL 语句,我需要一种将实际文件解析为可执行语句的方法。根据我的阅读,似乎没有一个现有的库可以逐行读取文件,更不用说解析 SQL 特定的内容了。有人知道吗?

我目前的计划是使用以下方法将整个文件读入 NSString:

NSString *fileContents = [NSString stringWithContentsOfFile:filePath 
                                                   encoding:NSUTF8StringEncoding
                                                      error:&error];

从那里我将通过使用[NSScanner scanUpToString][NSString componentsSeparatedByString] 在分号上拆分字符串来解析语句。我一直告诉自己必须有更好的方法来做到这一点,因为使用这种粗略的方法,我将失去在脚本中包含 cmets 的能力。有什么建议吗?

【问题讨论】:

    标签: iphone sql objective-c sqlite


    【解决方案1】:

    无需解析 DDL 即可创建新的可写数据库。取而代之的是,附带一个已经创建的新空数据库,备份用户当前数据库,复制新数据库,然后根据需要转移。

    此外,在这一点上,您真的会好很多,看看 CoreData,它为简单的更改(如新字段等)提供自动数据库迁移。

    【讨论】:

      【解决方案2】:

      你可能把问题复杂化了。以下是我的理解:

      您有一个 sqlite 数据库和不同版本的架构。您需要将架构从它所在的任何版本更新到最新版本。到目前为止还好吗?

      您可以使用 SQL 语句文件,在这种情况下,您只需读取文件,将字符串分解为语句(拆分为 ; 或 \n 或其他内容),然后自己执行每个语句。 (你是using a wrapper, right?)

      或者,您可以在代码中执行升级。当我过去这样做时,我在我的模式中添加了一个额外的表,这个表基本上是一组名称-值对。其中一对是模式​​的当前版本(如“SCHEMA_VERSION”=>“4”或其他东西)。然后,我有一个基本上可以做到这一点的方法:

      - (void) upgradeDatabase {
        int schema_version = [myDatabase retrieveSchemaVersion];
        switch(schema_version) {
          case 4:
            //upgrade to version 5
          case 5:
            //upgrade to version 6
          case 6:
            //upgrade to version 7
          case default:
            break;
        }
      }
      

      当然,您可以只使用 Core Data,它会为您进行基本的架构迁移。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2011-04-29
        • 2012-11-04
        • 2014-04-30
        相关资源
        最近更新 更多