Разбор SQL-файла в Objective-C - PullRequest
0 голосов
/ 19 января 2010

Кто-нибудь знает библиотеку Objective-C, которая позволит разработчикам легко анализировать файл SQL?Я создаю приложение для iPhone, которое содержит базу данных SQLite, и я пытаюсь установить систему для обновления базы данных пользователя, доступной для записи.После прочтения множества вопросов и ответов на этом сайте выясняется, что лучший способ выполнить операции DDL и DML - это сохранить список файлов SQL, которые будут выполнять необходимые обновления базы данных.Итак, теперь, когда я решил, что я собираюсь прочитать файл SQL в комплекте приложений, а затем выполнить отдельные операторы SQL, мне нужен способ разбить реальный файл на исполняемые операторы.Из того, что я прочитал, похоже, не существует существующей библиотеки, которая будет читать файл построчно, не говоря уже о синтаксическом анализе содержимого, специфичного для SQL.Кто-нибудь знает об этом?

Мой текущий план состоит в том, чтобы прочитать весь файл в строку NSString, используя:

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

Оттуда я собираюсь разобрать операторы, разбив строкуточка с запятой, используя [NSScanner scanUpToString] или [NSString componentsSeparatedByString].Я продолжаю говорить себе, что должен быть лучший способ сделать это, потому что, используя этот грубый метод, я потеряю возможность включать комментарии в сценарии.Есть предложения?

Ответы [ 2 ]

1 голос
/ 19 января 2010

Нет необходимости анализировать DDL для создания новой доступной для записи базы данных. Вместо этого отправьте с уже созданной новой пустой БД, создайте резервную копию текущей базы данных пользователей, скопируйте новую на место и затем перенесите ее по мере необходимости.

Кроме того, вам действительно было бы намного лучше, если бы вы посмотрели на CoreData, которая предлагает автоматическую миграцию БД для простых изменений (таких как новые поля и т. Д.).

0 голосов
/ 19 января 2010

Возможно, вы слишком усложняете проблему. Вот что я понял:

У вас есть база данных sqlite и разные версии вашей схемы. Вам необходимо обновить схему с любой версии до последней версии. Хорошо до сих пор?

Вы можете использовать файл операторов SQL, и в этом случае вы можете просто прочитать свой файл, разбить строку на операторы (разделить на; или \ n или что-то еще), а затем выполнить каждый оператор самостоятельно. (Вы используете обертку, верно ?)

Или вы можете выполнить обновление в коде. Когда я делал это в прошлом, я добавил дополнительную таблицу в свою схему, и эта таблица в основном представляет собой набор пар имя-значение. Одна из пар - это текущая версия схемы (например, «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, которая выполняет базовую миграцию схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...