精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Swift 定制 Core Data 遷移

開發 前端
文章介紹了在應用程序發展過程中,數據模型可能需要進行更改的情況下,如何使用 Core Data 遷移來保持數據的一致性和完整性。首先,它解釋了什么是 Core Data 遷移,以及為什么需要進行遷移。

前言

隨著應用程序和用戶群的增長,你需要添加新功能,刪除其他功能,并改變應用程序的工作方式。這是軟件開發生命周期的自然結果,我們應該接受。

隨著應用程序的發展,你的數據模型也會發生變化。你需要更改數據結構的方式,以適應新功能,同時確保用戶不會在不同版本之間丟失任何數據。如果你使用 Core Data 在應用程序中持久化信息,那么 Core Data 遷移就會發揮作用。

什么是 Core Data 遷移?

Core Data 遷移是將數據模型從一個版本更新到另一個版本的過程,因為數據的形狀發生了變化(例如,添加或刪除新屬性)。

在大多數情況下,Core Data 將自動處理遷移過程。但是,有些情況下,你需要通過提供一個映射模型來自定義遷移過程,告訴 Core Data 究竟如何從源模型遷移到目標模型中的每個屬性和實體。

甚至有些情況下,映射模型是不夠的,你需要編寫自定義遷移策略來處理特定情況。這是本文要重點討論的情況。

示例

讓我們考慮一個應用程序,在 Core Data 棧中存儲表示音樂曲目的對象。模型非常簡單,只包含一個實體:Track,Track.swift 代碼如下:

Copy code
Track.swift
import Foundation
import CoreData

@objc(Track)
public class Track: NSManagedObject, Identifiable {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Track> {
        return NSFetchRequest<Track>(entityName: "Track")
    }

    @NSManaged public var imageURL: String?
    @NSManaged public var json: String?
    @NSManaged public var lastPlayedAt: Date?
    @NSManaged public var title: String?
    @NSManaged public var artistName: String?
}

上面的 Track 實體有五個屬性:

  • imageURL:表示曲目封面圖像的 URL 的字符串。
  • json:表示來自服務器的原始 JSON 數據響應的字符串。
  • lastPlayedAt:表示上次播放曲目的日期。
  • title:表示曲目的標題的字符串。
  • artistName:表示藝術家的名稱的字符串。

Core Data 棧不會與 iCloud 同步,并具有以下設置,CoreDataStack.swift 文件代碼如下:

Copy code
CoreDataStack.swift
import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    let container: NSPersistentContainer

    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "CustomMigration")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }

        container.viewContext.automaticallyMergesChangesFromParent = true
        if let description = container.persistentStoreDescriptions.first {
            description.shouldMigrateStoreAutomatically = true
            description.shouldInferMappingModelAutomatically = false
        }

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
}

如果你仔細觀察上面的示例,你會注意到我們告訴 Core Data 自動遷移存儲,因為我們不想做漸進式遷移,這種遷移速度慢得多且更復雜,并且我們還告訴 Core Data 不要自動推斷映射模型,這意味著我們將不得不為每個遷移提供一個映射模型文件,并且可以允許我們自定義這個過程。

持久化了一首歌曲后,使用 Core Data Lab 檢查數據庫,我們可以看到屬性被相應保存:

更新模型

當前版本的模型存在一些可擴展性問題:

  • 模型僅允許每個曲目有一個藝術家,而實際上,一個曲目可以有多個藝術家。
  • 模型存儲一個表示曲目數據的原始 JSON 字符串,這不太高效,當應用程序需要解析 JSON 字符串以顯示曲目數據以獲取藝術家列表時,可能會導致性能問題。

為了解決這些問題,讓我們刪除 artistName 和 json 屬性,采用一個新的 Artist 實體,該實體將與 Track 實體建立一對多的關系。

Artist 實體將具有一個表示藝術家名稱的 name 屬性,以及 id 和 imageURL 屬性,我們將從原始 JSON 字符串中獲取它們。

創建一個新的模型版本

首先,讓我們通過選擇 .xcdatamodeld 文件,然后從菜單欄中選擇 Editor > Add Model Version... 來創建一個新的模型版本。

給它起一個名稱,并以第一個模型版本為基礎:

現在,讓我們創建 Artist 實體并添加所有字段:

也讓我們為新的 Artist 實體創建 NSManagedObject 子類,Artist.swift 代碼如下:

Copy code
import Foundation
import CoreData

@objc(Artist)
public class Artist: NSManagedObject, Identifiable {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Artist> {
        return NSFetchRequest<Artist>(entityName: "Artist")
    }

    @NSManaged public var name: String?
    @NSManaged public var id: String?
    @NSManaged public var imageURL: String?
    @NSManaged public var tracks: NSSet?

    @objc(addTracksObject:)
    @NSManaged public func addToTracks(_ value: Track)

    @objc(removeTracksObject:)
    @NSManaged public func removeFromTracks(_ value: Track)

    @objc(addTracks:)
    @NSManaged public func addToTracks(_ values: NSSet)

    @objc(removeTracks:)
    @NSManaged public func removeFromTracks(_ values: NSSet)
}

正如你在上面的示例中看到的那樣,我們將向 Track 實體添加一個對多的 artists 關系,還將向 Artist 實體添加一個對多的 tracks 關系。

現在,讓我們為 Track 實體添加缺失的關系,并刪除 artistName 和 json 屬性:

并更新 NSManagedObject 子類以反映更改,Track.swift 文件代碼如下:

import Foundation
import CoreData

@objc(Track)
public class Track: NSManagedObject, Identifiable {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Track> {
        return NSFetchRequest<Track>(entityName: "Track")
    }

    @NSManaged public var imageURL: String?
    @NSManaged public var lastPlayedAt: Date?
    @NSManaged public var title: String?
    @NSManaged public var artists: NSSet?

    @objc(addArtistsObject:)
    @NSManaged public func addToArtists(_ value: Artist)

    @objc(removeArtistsObject:)
    @NSManaged public func removeFromArtists(_ value: Artist)

    @objc(addArtists:)
    @NSManaged public func addToArtists(_ values: NSSet)

    @objc(removeArtists:)
    @NSManaged public func removeFromArtists(_ values: NSSet)
}

最后但并非最不重要的,讓我們將新的模型設置為 .xcdatamodeld 文件的當前模型:

創建映射模型

由于我們告訴 Core Data 不要自動推斷映射模型,所以我們將不得不創建一個映射模型文件來在兩個版本之間建立橋梁。

從菜單欄中選擇 File > New > File...,然后選擇 Mapping Model。

然后,選擇源模型:

最后,選擇目標模型:

編寫自定義遷移策略

默認情況下,Core Data 將盡力映射屬性,并且大部分工作都將由它自動完成(包括已刪除的屬性)。

然而,由于我們創建了一個新的實體,并且我們希望保留現有數據,因此我們需要告訴 Core Data 如何遷移。

我們將創建一個新的類,該類繼承自 NSEntityMigrationPolicy,并在舊的 Track 實體上創建并鏈接一個新的關系到 Artist 實體,V2MigrationPolicy.swift 文件代碼如下:

Copy code
import CoreData

struct Song: Decodable {
    let artists: [Artist]

    struct Artist: Decodable {
        let id: String
        let name: String
        let imageURL: String
    }
}

class V2MigrationPolicy: NSEntityMigrationPolicy {
    private let decoder = JSONDecoder()

    override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
        // 1
        let sourceKeys = sInstance.entity.attributesByName.keys
        let sourceValues = sInstance.dictionaryWithValues(forKeys: sourceKeys.map { $0 as String })

        // 2
        let destinationInstance = NSEntityDescription.insertNewObject(forEntityName: mapping.destinationEntityName!, into: manager.destinationContext)
        let destinationKeys = destinationInstance.entity.attributesByName.keys.map { $0 as String }

        // 3
        for key in destinationKeys {
            if let value = sourceValues[key] {
                destinationInstance.setValue(value, forKey: key)
            }
        }

        if let jsonString = sInstance.value(forKey: "json") as? String {
            // 3
            let jsonData = Data(jsonString.utf8)
            let object = try? decoder.decode(Song.self, from: jsonData)
            // 4
            let artists: [NSManagedObject] = object?.artists.map { jsonArtist in
                // 5
                let request = Artist.fetchRequest()
                request.fetchLimit = 1
                request.predicate = NSPredicate(format: "name == %@", jsonArtist.name)
                // Do not add duplicates to the list...
                if let matchedArtists = try? manager.destinationContext.fetch(request), let matchedArtist = matchedArtists.first {
                    return matchedArtist
                }
                // 6
                let artist = NSEntityDescription.insertNewObject(forEntityName: "Artist", into: manager.destinationContext)

                artist.setValue(jsonArtist.name, forKey: "name")
                artist.setValue(jsonArtist.imageURL, forKey: "imageURL")
                artist.setValue(jsonArtist.id, forKey: "id")

                return artist
            } ?? []

            // 7
            destinationInstance.setValue(Set<NSManagedObject>(artists), forKey: "artists")
        }

        // 8
        manager.associate(sourceInstance: sInstance, withDestinationInstance: destinationInstance, for: mapping)
    }
}

讓我們逐步解釋上面的代碼:

  • 獲取源實體的屬性名稱和值。
  • 創建與源實體相同類型的全新目標實體。
  • 將源實體的屬性值復制到目標實體。
  • 如果源實體具有 json 屬性,則將其解析為 Song 對象。
  • 為避免重復項,請檢查藝術家是否已經存在于目標上下文中。
  • 如果藝術家不存在,則創建一個新的 Artist 實體,將其插入到上下文中,并設置其屬性。
  • 設置目標實體上的新藝術家關系。
  • 將源和目標實例關聯起來。

最后,讓我們將此自定義策略添加到映射模型中:

現在,如果我們再次運行應用程序并使用 Core Data Lab 檢查數據庫,我們可以看到一個新的實體已經填充了正確的數據。

總結

文章介紹了在應用程序發展過程中,數據模型可能需要進行更改的情況下,如何使用 Core Data 遷移來保持數據的一致性和完整性。首先,它解釋了什么是 Core Data 遷移,以及為什么需要進行遷移。接著,通過一個示例應用程序,詳細介紹了如何更新數據模型,添加新實體和關系,以解決現有模型的可擴展性問題。然后,文章介紹了如何創建映射模型來定義不同模型版本之間的映射關系,并演示了如何編寫自定義遷移策略來處理特定情況,例如將舊模型數據遷移到新模型的新關系中。最后,通過將自定義遷移策略添加到映射模型中,完成了整個遷移過程。

責任編輯:姜華 來源: Swift社區
相關推薦

2021-07-13 12:20:40

Core DataSwiftUIiOS

2023-01-09 08:00:00

遷移學習機器學習數據集

2024-03-22 08:11:20

.NETJSON數據序列化

2011-07-21 14:50:06

Core Data SQL

2011-06-14 14:27:02

Core DataCocoa TouchiOS

2013-12-13 09:55:12

SQLite數據庫

2019-04-23 08:00:08

Azure微軟云遷移

2011-08-19 17:44:01

2010-03-01 09:19:22

Fedora Core

2020-03-02 14:34:18

.NET版本微軟

2025-03-05 08:40:43

項目數據庫流程

2015-09-02 09:40:21

core data工具開源庫

2015-10-19 11:06:42

CoreDate開源庫

2013-08-08 10:43:23

Bootstrap

2010-01-18 10:05:20

FreeBSD內核

2014-07-01 09:22:01

SwiftObjective-CiOS

2024-12-11 15:15:42

2014-12-31 13:31:31

圖形動畫翻頁

2020-07-20 06:35:55

BashLinux

2020-07-27 16:52:59

Mailmerge定制郵件系統應用
點贊
收藏

51CTO技術棧公眾號

91av免费观看91av精品在线| 日韩亚洲欧美一区| 中文精品一区二区三区| 国产精品怡红院| 激情综合亚洲| 国产午夜精品全部视频播放| 国产精品自在自线| 色在线中文字幕| 中文字幕欧美一| 国产成人看片| 国产偷人爽久久久久久老妇app| 婷婷综合伊人| 亚洲欧美精品中文字幕在线| 午夜不卡福利视频| 少妇视频在线观看| 亚洲久草在线视频| 免费看污久久久| 国产情侣激情自拍| 视频在线观看国产精品| 欧美精品做受xxx性少妇| 加勒比一区二区| 一区二区三区视频免费视频观看网站| 91黄视频在线观看| 激情小视频网站| 精品51国产黑色丝袜高跟鞋| 久久婷婷综合激情| 国产高清在线一区| 国产精品一级视频| 热久久一区二区| 2020久久国产精品| 国产在线视频99| 欧美1区2区3区| 在线日韩第一页| 亚洲一区二区观看| 欧美日韩另类图片| 欧美成人a在线| 97超碰人人看| 国产一区二区三区| 91麻豆精品国产91久久久更新时间 | 亚洲国产综合在线| wwwjizzjizzcom| 午夜在线小视频| 久久精品一区二区三区四区| 国产一区自拍视频| 亚洲欧美另类视频| 国产激情视频一区二区在线观看 | 久久天天久久| 91福利视频在线| 亚洲自偷自拍熟女另类| 91老司机福利在线| 亚洲国产人成综合网站| 韩国黄色一级大片| 在线中文免费视频| 亚洲精品日日夜夜| 穿情趣内衣被c到高潮视频| 欧美69xxxx| ㊣最新国产の精品bt伙计久久| 亚洲一区二区三区免费看| 成人高清在线| 国产精品入口麻豆九色| 亚洲人成人77777线观看| 五月天婷婷在线视频| 中文字幕亚洲欧美在线不卡| 国产系列第一页| 国产三级在线播放| 亚洲综合一二三区| 成人在线观看你懂的| 深夜成人在线| 欧美日韩一区二区欧美激情| www.国产福利| 成人高潮a毛片免费观看网站| 欧美精品一区二区三区蜜桃视频| 污片免费在线观看| 精品国产一区二区三区噜噜噜| 最近2019年手机中文字幕| 国产性生活大片| 黄色成人在线网站| 欧美中文在线字幕| 91福利免费视频| 成人一区二区三区在线观看| 久99久在线| aⅴ在线视频男人的天堂| ...av二区三区久久精品| 国产免费裸体视频| 久久久成人av毛片免费观看| 777久久久精品| 日韩www视频| 欧美日韩水蜜桃| 久久99国产精品久久久久久久久| 日本少妇久久久| 日韩电影在线免费看| 51国产成人精品午夜福中文下载| 欧洲亚洲在线| 亚洲免费在线观看视频| 777久久久精品一区二区三区 | 91黄色免费版| 杨幂一区二区国产精品| 中文字幕精品影院| 久久这里只有精品视频首页| 日韩黄色一级大片| 国产在线视频一区二区三区| 久久国产精品久久| 欧洲日本在线| 色综合视频在线观看| 成人亚洲免费视频| 欧美男gay| 欧美激情性做爰免费视频| www.久久视频| 99精品欧美一区二区蜜桃免费| 性欧美.com| 亚洲美女尤物影院| 日韩精品一区二区三区swag | 国产欧美婷婷中文| 天堂а在线中文在线无限看推荐| 一区二区三区中文字幕电影| 日本999视频| 天海翼亚洲一区二区三区| 九九热这里只有精品免费看| 在线观看视频中文字幕| 91视频免费播放| 成人在线国产视频| 国产精一区二区| 丝袜美腿亚洲一区二区| 国产寡妇亲子伦一区二区三区四区| 国产不卡免费视频| 91麻豆天美传媒在线| 欧美日韩免费电影| 中文字幕av一区| 91黑人精品一区二区三区| 97se亚洲国产综合自在线| 日韩在线视频在线| 日韩精品中文字幕一区二区 | 国产在线看一区| 西游记1978| 性欧美gay| 亚洲欧美综合精品久久成人| 日韩成人免费观看| 成人av网站大全| 久久久久久久9| 亚洲高清在线一区| 欧美片一区二区三区| 国内精品久久久久久久久久| 亚洲人亚洲人成电影网站色| 日本不卡一区在线| 99久久99久久精品国产片果冰| 国产精品久久二区| 日本免费在线视频| 91精品午夜视频| av成人免费网站| 国模少妇一区二区三区| 特级黄色录像片| 警花av一区二区三区| zzijzzij亚洲日本成熟少妇| 国产精品视频在线观看免费| 成人免费在线视频观看| 免费网站在线观看黄| 久久精品国内一区二区三区水蜜桃| 国产精品视频专区| 成人av福利| 日韩欧美一级在线播放| 精品亚洲永久免费| 国产成人精品影视| 亚洲熟妇无码一区二区三区| 香蕉视频一区| 国产欧美一区二区三区四区| 黄色网页在线观看| 亚洲激情国产精品| 日本a级c片免费看三区| 国产精品家庭影院| 潘金莲一级淫片aaaaaaa| 亚洲高清av| 日本免费高清一区二区| 香蕉成人在线| 久久频这里精品99香蕉| 黄色片在线免费看| 91精品免费在线观看| 精品人妻在线播放| 久久久国产精华| 中文字幕一区二区在线观看视频| 欧美日韩一区二区三区四区在线观看| 九色91视频| 国产精品欧美一区二区三区不卡 | 日韩精品一区二区在线播放| 国产三级久久久| 日韩a一级欧美一级| 亚洲激情不卡| 亚洲精品视频一区二区三区| 亚洲天堂中文字幕在线观看| 国产69久久精品成人| 黄色网在线免费观看| 日韩精品电影网| 97超视频在线观看| 狠狠色香婷婷久久亚洲精品| 久久久99999| 91欧美一区二区| xxx中文字幕| 久久一区二区三区超碰国产精品| 亚洲AV无码成人精品一区| 日本一道高清一区二区三区| 国产日韩在线一区| 国内精彩免费自拍视频在线观看网址| 中文字幕亚洲欧美日韩高清 | 欧美另类中文字幕| 国产成人精品av在线| 国产精品186在线观看在线播放| 在线播放国产精品| 天天干天天爽天天操| 777xxx欧美| 中日精品一色哟哟| 黄色成人av在线| 免费在线观看亚洲| 国产精品麻豆欧美日韩ww| 中文字幕一区三区久久女搜查官| 国产在线一区观看| 视频二区在线播放| 玖玖在线精品| 国产成人在线免费看| 欧美激情1区2区3区| 亚洲精品成人三区| 亚洲人亚洲人色久| 精品卡一卡二| 超碰在线亚洲| 成人av免费在线看| www.欧美视频| 国产热re99久久6国产精品| 精品91久久| 青草青草久热精品视频在线网站 | 国产亚洲第一区| 久久综合给合| 91免费版网站入口| 日韩大陆av| 国产欧美日韩中文字幕在线| 99久久伊人| 国产精品99久久久久久www| 成人免费短视频| 2019中文字幕免费视频| 草草在线视频| 91精品国产免费久久久久久| 国产精品186在线观看在线播放| 久久久久久久久国产精品| 午夜羞羞小视频在线观看| 精品中文字幕在线| 亚洲91av| 国内精品小视频在线观看| 搞黄网站在线看| 海角国产乱辈乱精品视频| 黄色羞羞视频在线观看| 国模视频一区二区三区| av在线私库| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲欧美一区二区三区| 国产成人精品一区二区三区| 91精品影视| 国产精品欧美亚洲777777| 影音成人av| 91久久国产精品91久久性色| 亚洲精品aaa| 2022国产精品| 精品嫩草影院| 欧美午夜精品久久久久免费视| 国产日韩欧美一区二区三区| 欧日韩一区二区三区| 成人羞羞动漫| 路边理发店露脸熟妇泻火| 精品99视频| 久草资源站在线观看| 视频一区二区不卡| 91欧美一区二区三区| 波多野结衣中文字幕一区二区三区 | 国产aa精品| 国产高清不卡av| 少妇精品久久久| 国产系列第一页| 亚洲精品资源| 黄色片在线免费| 国产伦精品一区二区三区在线观看| 亚洲av无码专区在线播放中文| 91免费看片在线观看| 欧美a在线播放| 亚洲一区二区欧美| 波多野结衣一区二区三区在线| 欧美精品日韩一区| 天堂成人在线| 久久中文字幕在线视频| 天堂资源在线| 成人免费福利在线| 日韩大片在线免费观看| 一本久久a久久精品vr综合 | 精品一区二区三区中文字幕老牛| 国产奶头好大揉着好爽视频| 中国女人久久久| 午夜剧场在线免费观看| 99久免费精品视频在线观看| 青青操在线播放| 天天操天天色综合| 国产成人精品免费看视频| 亚洲美女精品久久| 羞羞视频在线免费国产| 国产精品精品一区二区三区午夜版 | 99精品国产一区二区青青牛奶| 中文字幕在线观看第三页| 国产成人午夜电影网| 中文天堂资源在线| 亚洲成人在线网站| 91麻豆国产视频| 亚洲精品一区二区三区不| 色黄网站在线观看| 国产精品无码专区在线观看| 另类ts人妖一区二区三区| 中文字幕中文字幕在线中一区高清 | 欧美激情777| 无罩大乳的熟妇正在播放| 国产一区二区三区蝌蚪| 久久精品—区二区三区舞蹈| 亚洲国产精品自拍| 国产农村老头老太视频| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 日韩美女视频网站| 欧美一级高清大全免费观看| 国产无套粉嫩白浆在线2022年| 久久久久亚洲精品| 玖玖玖视频精品| 超碰在线免费观看97| 免费观看久久久4p| 亚洲国产日韩一区无码精品久久久| 香蕉影视欧美成人| 亚洲精品视频网| 欧美国产乱视频| 粉嫩av国产一区二区三区| 在线视频精品一区| 蜜桃传媒麻豆第一区在线观看| 男女做爰猛烈刺激| 色噜噜狠狠成人中文综合| 午夜性色福利影院| 51午夜精品视频| 伦理一区二区| 日韩a∨精品日韩在线观看| 成人app下载| 国产成人无码精品亚洲| 日韩黄色在线免费观看| 涩涩涩在线视频| 欧美日韩在线一二三| 丝袜美腿亚洲一区二区图片| 日韩精品无码一区二区三区久久久 | 久久免费福利| 国产一二三四区在线观看| 国产传媒日韩欧美成人| 久久久久久久久久久久久久免费看| 日韩欧美国产电影| 日本电影在线观看| 99电影网电视剧在线观看| 国产精品xvideos88| 一本色道久久hezyo无码| 亚洲国产美国国产综合一区二区 | 在线观看视频亚洲| 日韩免费在线电影| 宅男噜噜99国产精品观看免费| 国产在线一区观看| 国产精品变态另类虐交| 亚洲精品成人久久久| 在线观看精品| 午夜啪啪免费视频| 国产成人av一区二区三区在线观看| 国产一级在线播放| 亚洲欧美激情在线视频| 成人美女在线视频| 久久久精品国产sm调教| 精品国产精品网麻豆系列| 欧美伦理91| 亚洲精美视频| 福利一区二区在线| 四虎成人在线观看| 日韩最新在线视频| 99久热这里只有精品视频免费观看| 浮妇高潮喷白浆视频| 国产欧美一区二区精品忘忧草| 国产又粗又猛又色又| 久久久久久久影院| 少妇精品久久久一区二区| 北条麻妃亚洲一区| 亚洲成人免费在线| 在线观看二区| 国产a一区二区| 日韩高清中文字幕一区| 美女的奶胸大爽爽大片| 亚洲美女激情视频| 成人豆花视频| 国产一区视频免费观看| 亚洲三级电影全部在线观看高清| 四虎在线免费观看| 91天堂在线观看| 美女91精品| 国内偷拍精品视频| 亚洲性69xxxbbb| 激情视频极品美女日韩| 五月婷婷六月合| 精品毛片网大全| 操你啦在线视频| 欧美综合激情| 99综合电影在线视频|