Базовые Данные по сравнению с SQLite для опытных разработчиков SQL

Объединить файлы

Проблемы с кодом

Вы объявили numberOfFilesChosen как Variant:

Dim numberOfFilesChosen, i As Integer ' Wrong
Dim numberOfFilesChosen as Integer, i As Integer ' OK

Вы объявили mainWorkbook как Variant:

Dim mainWorkbook, sourceWorkbook As Workbook ' Wrong
Dim mainWorkbook as Workbook, sourceWorkbook As Workbook ' OK

Такой код должен быть в рабочей книге (mainWorkbook), куда импортируются рабочие таблицы, поэтому вам не нужна переменная, просто используйте ThisWorkbook. Затем в сочетании с оператором With вы можете использовать, например, .Sheets(.Sheets.Count).

Вы переключаетесь между листами и листами. Когда вы используете mainWorkbook.Worksheets.Count, это не обязательно будет последний лист, поэтому было бы правильнее использовать mainWorkbook.Sheets.Count, особенно для того, чтобы добавленный счетчик листов работал правильно.

tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)
tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Sheets.Count) ' Preferable

Когда вы используете sourceWorkbook.Close, вас могут попросить сохранить книгу. Использование

sourceWorkbook.Close False ' Preferable

закроет книгу без сохранения изменений.

Код не будет выполнен, если вы запустите его в другой раз, потому что имена листов, которые он попытается создать, совпадают. Поэтому я добавил DeleteWorksheetsExceptOne, который использовал при тестировании кода.

Код

Sub mergeFiles()
    'Merges all files in a folder to a main file.

    'Define variables:
    Dim tempFileDialog As FileDialog
    Dim sourceWorkbook As Workbook
    Dim tempWorkSheet As Worksheet
    Dim numberOfFilesChosen As Long, i As Long, j As Long

    Set tempFileDialog = Application.FileDialog(msoFileDialogFilePicker)

    'Allow the user to select multiple workbooks
    tempFileDialog.AllowMultiSelect = True
    numberOfFilesChosen = tempFileDialog.Show

    With ThisWorkbook
        'Loop through all selected workbooks
        For i = 1 To tempFileDialog.SelectedItems.Count
            'Open each workbook
            Workbooks.Open tempFileDialog.SelectedItems(i)
            Set sourceWorkbook = ActiveWorkbook
            j = 0

            'Copy each worksheet to the end of the main workbook
            For Each tempWorkSheet In sourceWorkbook.Worksheets
                j = j + 1
                tempWorkSheet.Copy After:=.Sheets(.Sheets.Count)
                ' Rename newly added worksheet to the name of Source Workbook
                ' concatenated with "-" and Counter (j).
                .Sheets(.Sheets.Count).Name = sourceWorkbook.Name & "-" & j
            Next

            'Close the source workbook. False for not saving changes.
            sourceWorkbook.Close False
        Next
    End With

End Sub

Удалить все рабочие таблицы, кроме одной

'*******************************************************************************
' Purpose:  Deletes all Worksheets in the ActiveWorkbook except one.
' Danger:   This code doesn't ask anything, it just does. In the end you will
'           end up with just one worksheet (cStrWsExcept) in the workbook
'           (cStrWbPath). If you have executed this code and the result is not
'           satisfactory, just close the workbook and try again or don't. There
'           will be no alert like "Do you want to save ..." because of the line:
'           ".Saved = True" i.e. "objWb.Saved = True".
' Arguments (As Constants):
'   cStrWbPath
'     The path of the workbook to be processed. If "", then ActiveWorkbook is
'     used.
'   cStrWsExcept
'     The worksheet not to be deleted. If "", then the Activesheet is used.
'*******************************************************************************
Sub DeleteWorksheetsExceptOne()

  Const cStrWbPath = ""          ' if "" then ActiveWorkbook
  Const cStrWsExcept = "Sheet1"  ' if "" then ActiveSheet

  Dim objWb As Workbook
  Dim objWsExcept As Worksheet
  Dim objWsDelete As Worksheet

  If cStrWbPath = "" Then
    Set objWb = ActiveWorkbook
   Else
    Set objWb = Workbooks(cStrWbPath)
  End If

  With objWb
    If cStrWsExcept = "" Then
      Set objWsExcept = .ActiveSheet
     Else
      Set objWsExcept = .Worksheets(cStrWsExcept)
    End If

    ' To suppress the "Data may exist in the sheet(s) selected for deletion.
    '                  To permanently delete the data, press Delete." - Alert:
    Application.DisplayAlerts = False

      For Each objWsDelete In .Worksheets
        If objWsDelete.Name <> objWsExcept.Name Then
          objWsDelete.Delete
        End If
      Next

      ' To suppress the "Do you want to save changes you made to ... ?" - Alert:
      .Saved = True

    Application.DisplayAlerts = True

  End With

End Sub
'*******************************************************************************
34
задан Community 23 May 2017 в 11:48
поделиться

3 ответа

Как вы читали Core Data vs SQLite 3 , вы знаете, что Core Data и механизм сохранения (в данном случае SQLite) в значительной степени ортогональны. Core Data на самом деле касается управления графом объектов, и его основной вариант использования - компонент модели архитектуры MVC. Если ваше приложение хорошо вписывается в эту архитектуру, вероятно, стоит использовать Core Data, поскольку это сэкономит вам много кода в компоненте модели. Если у вас уже есть работающий компонент модели (например, из существующего настольного приложения), Core Data не будет вам много покупать. Возможен гибридный подход - вы можете выполнить свое собственное сохранение / запрос и создать Core Data в хранилище памяти, которое вы заполняете результатом запроса, и использовать это хранилище в памяти через Core Data в качестве компонента модели для вашего приложения. Это н' Это обычное дело, но я сделал это, и здесь нет серьезных препятствий.

Чтобы ответить на ваши конкретные вопросы:

  1. Вы можете назначить номер версии всему постоянному хранилищу и получить эту информацию через + [NSPersistentStore metadataForPersistentStoreWithURL: error:] , даже не открывая магазин. Эквивалент + setMetadata: forPersistentStoreWithURL: error , конечно, также существует. Если вы хотите сохранить информацию о версии в экземпляре сущности, а не в метаданных постоянного хранилища, вы можете загрузить только один объект. Благодаря постоянному хранилищу SQLite Core Data отлично справляется с получением только того, что вам нужно.

  2. API NSPredicate очень прост в освоении и, похоже, неплохо справляется с компиляцией в SQL. , По крайней мере, для баз данных такого размера, который может поместиться на iPhone, s, безусловно, был адекватным (с точки зрения производительности), по моему опыту. Однако я думаю, что вопрос SQL и Core Data немного ошибочен. Что вы собираетесь с ним делать, получив результат запроса? Если вы откроете свой собственный, вам придется создавать экземпляры объектов, обрабатывать сбой / уникальность (если вы не хотите сразу загружать весь результат запроса в память) и все другие средства управления графом объектов, уже предоставленные Core Данные.

19
ответ дан 27 November 2019 в 17:14
поделиться

Похоже, у вас уже есть проект, разработанный с использованием SQLite, и у вас есть опыт в этой области.

Итак, суть в том, имеет ли смысл переносить этот проект, будет ли Core Данные дают мне то, чего у меня еще не было в моем первоначальном дизайне?

Если исходный дизайн был выполнен правильно, исходя из требований ЭТОГО ПРОЕКТА, это, вероятно, того не стоит.

Но это еще не конец. обсуждения. Есть и другие вещи, о которых стоит подумать: будут ли в моем следующем проекте такие легкие требования к базе данных? Мне нужно отправить товар в ближайшее время из-за ограничений по срокам или бюджету? Предполагая, что я Мне рано или поздно придется изучать Core Data, разве нет смысла делать это сейчас? Возможно, я заинтересован в переносе моего кода на Mac?

Ответы на эти вопросы могут привести вас к решению, что да, действительно стоит вернуться, так сказать, к чертежной доске и узнать, что такое ядро Все о данных.

Чтобы перейти к вашему заключительному вопросу: каковы преимущества? Что ж, Core Data - это абстракция более высокого уровня вашей базы данных, она также не зависит от хранилища данных (поэтому, если будущая версия iPhone откажется от SQLite для встроенной версии MySQL ... маловероятно, но это пример), тогда Core Данные потребуют ОЧЕНЬ немного изменений в коде, чтобы заставить его работать с новым хранилищем данных. Core Data обеспечит быструю переносимость на платформу Mac. Core Data будет управлять версиями вашей модели данных, тогда как если у вас нет фреймворка или рабочего процесса для управления им, прямого доступа к SQLite не будет.

Я уверен, что другие респонденты могут придумать другие преимущества и, возможно, некоторые веские причины, почему НЕ возиться с Core Data. Между прочим, в подобной ситуации я решил портировать на более высокий уровень, более новый фреймворк. Но в моем случае это был побочный проект, и дата отгрузки и бюджет не имели значения.

7
ответ дан 27 November 2019 в 17:14
поделиться

Чтобы не отвлекать внимание от этого форума, но вы можете найти больше респондентов с контекстно-релевантным опытом на Apple iPhone DevForum.

Если говорить с точки зрения чисто управления проектами, это звучит так, будто вы знаете, как для создания того, что вы хотите построить с использованием SQLite, и поэтому для меня было бы более разумным начать по этому пути.

При этом CoreData строится поверх SQLite, и если вы пытаетесь использовать другие части система в сочетании с вашими данными, например, с использованием KVC / KVO или привязок, то вы можете быстро обнаружить, что эта функция стоит кривой обучения.

= Майк

2
ответ дан 27 November 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: