Есть ли правильный способ сделать общие c грубые функции для Core Data в Swift? - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь реализовать Generi c Crud Operations в Swift для Core Data. Это проблема, с которой я сталкиваюсь при создании данных. Мне удалось добиться некоторого успеха, но я не могу найти способ добавить отношения между сущностями в общем c способе.

Я новичок в Core Data, и я также искал ответ, но не смог найти любой. Пожалуйста, помогите мне, если я смотрю неправильно.

Мои объекты:

Пользователь и Фильмы, где Пользователь имеет отношение "один ко многим" с Фильмами.

Пользователь и фильмы

Текущая функция для достижения этого:

   func createData<T>(forEntity entity: Entities, andObj objArr: [T]) {
    
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    
    let managedContext = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: entity.rawValue, in: managedContext)!
    
    for obj in objArr {
        let mirror = Mirror(reflecting: obj)
        let container = NSManagedObject(entity: entity, insertInto: managedContext)
        
        for child in mirror.children  {
            var shouldSkip = false
            for entityLocal in Entities.allCases {
                if child.label!.lowercased() == entityLocal.rawValue.lowercased(){
                    shouldSkip = true
                    if let childArr = child.value as? [Any] {
                        createData(forEntity: entityLocal, andObj: childArr)
                    }
                }
            }
            if !shouldSkip {
                container.setValue(child.value, forKey: child.label!)
                shouldSkip = false
            }
        }
        
        do {
            try managedContext.save()
        }
        catch let error as NSError {
            print(error.localizedDescription)
        }
    }
}

Где Entities:

enum Entities: String, CaseIterable {
 case User   = "User"
 case Movie  = "Movies"
}

И я имитирую вызов api и вызов функции, например:

var movies = [MovieModel]()
var users = [UserModel]()

for _ in 1...3 {
    let movie = MovieModel(title: "Man of Steel", rating: "9/10")
    movies.append(movie)
}

let user = UserModel(username: "Khan", email: "khan@example.com", password: "12345", movies: movies)
users.append(user)
        
CoreDataManager.sharedManager.createData(forEntity: Entities.User, andObj: users)

My Core Data Movies Table:

Mov ie Скриншот таблицы

Проблема в том, что пользователи и фильмы сохраняются в их уважаемых таблицах, но я также хочу иметь идентификатор пользователя во внешнем ключе фильмов. Пожалуйста, направьте меня и дайте мне знать, если я смотрю на это неправильно. Большое спасибо за ваше время.

1 Ответ

0 голосов
/ 10 августа 2020

Проблема в том, что пользователи и фильмы сохраняются в своих уважаемых таблицах, но я также хочу иметь идентификатор пользователя во внешнем ключе фильмов.

Первое, что вы нужно перестать думать о Core Data, как о базе данных SQL. Он не предназначен для работы таким же образом, и попытка использовать его как SQL усложнит вам задачу. Core Data использует SQLite внутри, но его API не похож на SQL.

Вы не используете внешние ключи в Core Data, вы используете отношения. У вас уже есть необходимые отношения, так что вы обычно используете их с Core Data. Если у вас есть экземпляр Movies, и вы хотите знать, что User идет с этим mov ie, вы используете отношение user, которое у вас уже есть. Чтобы это работало, вам нужно назначить значение для отношения при создании экземпляра. Когда вы создаете Movies, присвойте значение отношению user. Внешний ключ не требуется, поскольку существует связь.

Если вы предпочитаете использовать подход, подобный SQL, существует несколько доступных оболочек SQLite с открытым исходным кодом, например FMDB и PLDatabase .

...