SwiftData Custom Migration всегда терпит неудачу - возможна ошибка в SwiftDataIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 SwiftData Custom Migration всегда терпит неудачу - возможна ошибка в SwiftData

Сообщение Anonymous »

Я использую SwiftData в моем приложении Swiftui ios, и мне нужно реализовать MigrationPlan перед запуском, поэтому дела идут гладко позже, когда мне нужно внести изменения в сохраненные данные. SwiftData, поскольку сохраненная модель не имеет правильного типа. < /P>

текущая настройка < /h3>
Текущий @model < /code>, что довольно проста по стандартам Swiftdata, за исключением того, что у нее есть гораздо больше свойств, чем я включал здесь: < /p>

Код: Выделить всё

@Model
final class MyData
{
var property1: Bool = true
var property2: Bool = true
var property3: Int = 1
// And many more properties...

// Default init.
init()
{
// Assign default values to properties.
self.property1 = true
self.property2 = true
self.property3 = 1
// ...
}

// Dynamic init.
init(
property1: Bool,
property2: Bool,
property3: Int
)
{
self.property1 = property1
self.property2 = property2
self.property3 = property3
// ...
}
}
Создание ModelContainer :

Код: Выделить всё

var sharedModelContainer: ModelContainer =
{
let schema = Schema(
[
MyData.self,
])

let modelConfiguration = ModelConfiguration(
schema:                 schema,
isStoredInMemoryOnly:   false
)

do
{
return try ModelContainer(
for:                schema,
configurations:     [modelConfiguration]
)
}
catch
{
fatalError("Could not create ModelContainer: \(error)")
}
}()

@main
struct myApp: App
{
var body: some Scene
{
WindowGroup
{
ContentView()
}
.modelContainer(sharedModelContainer)
}
}
< /code>

 Попытка миграции < /h3>
Чтобы начать реализацию миграции, я переименовал модель, чтобы отразить его версию: < /p>
@Model
final class MyDataV1
{
// No other changes compared to the code shared above.
}
Затем я определил myDataV2 , чтобы представить новый формат данных. Единственное, что изменилось,-это тип Property1 :

Код: Выделить всё

@Model
final class MyDataV2
{
// Changed to an array.
var property1: [Bool] = [true]
var property2: Bool = true
var property3: Int = 1
// And many more properties...

// Migration init.
init(
myDataV1: MyDataV1
)
{
// Convert to an array.
self.property1 = [myDataV1.property1]
self.property2 = myDataV1.property2
self.property3 = myDataV1.property3
// ...
}

// Default init.
init()
{
// Assign default values to properties.
self.property1 = [true]
self.property2 = true
self.property3 = 1
// ...
}

// Dynamic init.
init(
property1: [Bool],
property2: Bool,
property3: Int
)
{
self.property1 = property1
self.property2 = property2
self.property3 = property3
// ...
}
}
Я определил Typealias , чтобы отразить текущую версию, поэтому другие части моего приложения не должны продолжать обновлять их ссылки:

Код: Выделить всё

typealias MyData = MyDataV2
Я определил два экземпляра версии versionschema , один для представления V1, а другой-V2:

Код: Выделить всё

enum MyDataSchemaV1: VersionedSchema
{
static var versionIdentifier: Schema.Version = Schema.Version(1, 0, 0)

static var models: [any PersistentModel.Type]
{
[MyDataV1.self]
}
}

enum MyDataSchemaV2: VersionedSchema
{
static var versionIdentifier: Schema.Version = Schema.Version(2, 0, 0)

static var models: [any PersistentModel.Type]
{
[MyDataV2.self]
}
}
Я определил SchemamigrationPlan для обработки миграции из myDatav1 в myDatav2 :

Код: Выделить всё

enum MyDataMigrationPlan: SchemaMigrationPlan
{
static var schemas: [any VersionedSchema.Type]
{
[MyDataSchemaV1.self, MyDataSchemaV2.self]
}

static var stages: [MigrationStage]
{
[migrateFromV1ToV2]
}

private static var migrationFromV1ToV2Data: [MyDataV1] = []

static let migrateFromV1ToV2 = MigrationStage.custom(
fromVersion:    MyDataSchemaV1.self,
toVersion:      MyDataSchemaV2.self,
willMigrate:
{
modelContext in

let descriptor  : FetchDescriptor    = FetchDescriptor()
let v1Data      : [MyDataV1]                   = try modelContext.fetch(descriptor)

migrationFromV1ToV2Data = v1Data

try modelContext.delete(model: MyDataV1.self)
try modelContext.save()
},
didMigrate:
{
modelContext in

migrationFromV1ToV2Data.forEach
{
myDataV1 in

let myDataV2 = MyDataV2(myDataV1: myDataV1)
modelContext.insert(myDataV2)
}

try modelContext.save()
}
)
}
и, наконец, я обновил модельконтентер инициализация, чтобы включить план миграции:

Код: Выделить всё

var sharedModelContainer: ModelContainer =
{
let schema = Schema(
[
MyData.self,
])

let modelConfiguration = ModelConfiguration(
schema:                 schema,
isStoredInMemoryOnly:   false
)

do
{
return try ModelContainer(
for:                schema,
migrationPlan:      MyDataMigrationPlan.self,
configurations:     [modelConfiguration]
)
}
catch
{
fatalError("Could not create ModelContainer: \(error)")
}
}()
< /code>

 ошибки миграции < /h3>
Я создал ситуацию, в которой экземпляр mydatav1 < /code> уже был сохранен в SwiftData, а затем я реализовал изменения выше и запустил новую версию. < /p>
я добавил в Mogrationplan.  Willmigrate 
запускается и заканчивается без каких -либо ошибок, но приведенные ниже ошибки отображаются до Didmigrate даже запускаются, и приведет к сбою приложения:

Код: Выделить всё

CoreData: error: Error: Persistent History (3178) has to be truncated due to the following entities being removed: (
MyDataV1
)
CoreData: warning: Warning: Dropping Indexes for Persistent History
CoreData: warning: Warning: Dropping Transactions prior to 3178 for Persistent History
CoreData: warning: Warning: Dropping Changes prior to TransactionID 3178 for Persistent History
CoreData: error: addPersistentStoreWithType:configuration:URL:options:error: returned error NSCocoaErrorDomain (134060)
CoreData: error: userInfo:
CoreData: error: NSLocalizedFailureReason : Instances of NSCloudKitMirroringDelegate are not reusable and should have a lifecycle tied to a given instance of NSPersistentStore.
CoreData: error: storeType: SQLite
CoreData: error: configuration: default
< /code>

 попытка решения 1 < /h3>
Я думал, что это может быть потому, что в Willmigrate < /code> я звонил следующее: < /p>
< /p>


Подробнее здесь: [url]https://stackoverflow.com/questions/79536880/swiftdata-custom-migration-always-fails-possible-bug-in-swiftdata[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • SwiftData Custom Migration всегда терпит неудачу - возможна ошибка в SwiftData
    Гость » » в форуме IOS
    0 Ответы
    32 Просмотры
    Последнее сообщение Гость
  • Сбой SwiftData Migration `Невозможно использовать поэтапную миграцию с неизвестной версией модели.`
    Anonymous » » в форуме IOS
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Mypy терпит неудачу с ожидаемым типом «Type[T]», вместо этого получен «UnionType»
    Anonymous » » в форуме Python
    0 Ответы
    67 Просмотры
    Последнее сообщение Anonymous
  • Мой файл .py работает отлично, но когда я превращаю его в .exe, он терпит неудачу.
    Anonymous » » в форуме Python
    0 Ответы
    66 Просмотры
    Последнее сообщение Anonymous
  • Аутентификация ssh2_auth_pubkey_file всегда терпит неудачу
    Anonymous » » в форуме Php
    0 Ответы
    54 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»