Closed12

【Swift】CoreData 0->1

yoshitakayoshitaka
  • エンティティのカスタマイズが必要: Manual/None, Category/Extension
    awakeFromInsert() や validateForInsert() などをオーバーライドする場合など
  • エンティティのカスタマイズが不要: Class Definition
yoshitakayoshitaka

自動生成されるファイル

Codegenを[Manual/None]にして
[Editor]-[Create NSManagedObject Subclass...]を実行して

クラス定義

+CoreDataClass.swift

import Foundation
import CoreData

@objc(Product)
public class Product: NSManagedObject {

}

エクステンション

+CoreDataProperties.swift

import Foundation
import CoreData


extension Product {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Product> {
        return NSFetchRequest<Product>(entityName: "Product")
    }

    @NSManaged public var name: String?
    @NSManaged public var price: Int64

}
yoshitakayoshitaka

Fetch Index Elementsは、WWDC 2017で発表されたAppleの新しいインデックスAPIの一部です。これらを使用すると、1つ以上のインデックス要素を指定できます。データベース検索を高速化するためのインデックスを作成するために使用されるプロパティ。あなたの場合、「title」プロパティは、「Passage」エンティティの下に「compoundIndex」と呼ばれるインデックスを作成するために使用され、より高速なタイトル検索を可能にします。

yoshitakayoshitaka

Coredata

単一のデバイスにデータを保存またはキャッシュするか、CloudKit を使用して複数のデバイスにデータを同期します。

Core Data を使用して、オフラインで使用できるようにアプリケーションの永続データを保存したり、一時データをキャッシュしたり、単一のデバイス上のアプリに元に戻す機能を追加したりします。 単一の iCloud アカウントで複数のデバイス間でデータを同期するために、Core Data はスキーマを CloudKit コンテナーに自動的にミラーリングします。
Core Data のデータ モデル エディターを使用して、データのタイプと関係を定義し、それぞれのクラス定義を生成します。 Core Data は実行時にオブジェクト インスタンスを管理して、次の機能を提供できます。

Persistence

「パーシステンス」って単語が出てきたら「ロードバランサにおけるセッションを維持するための仕組みなんだな~」と、お考えください。

Core Data は、オブジェクトをストアにマッピングする詳細を抽象化し、データベースを直接管理することなく、Swift および Objective-C からデータを簡単に保存できるようにします。

個々の変更または一括変更の取り消しとやり直し

Core Data の undo マネージャーは変更を追跡し、個別に、グループに、または一度にすべてをロールバックできるため、アンドゥとやり直しのサポートをアプリに簡単に追加できます。

Background Data Tasks

JSON をオブジェクトに解析するなど、UI をブロックする可能性のあるデータ タスクをバックグラウンドで実行します。 その後、結果をキャッシュまたは保存して、サーバーのラウンドトリップを減らすことができます。

同期を表示

Core Data は、テーブル ビューとコレクション ビューのデータ ソースを提供することで、ビューとデータの同期を維持するのにも役立ちます。

バージョン管理と移行

Core Data includes mechanisms for versioning your data model and migrating user data as your app evolves.

yoshitakayoshitaka

NSPersistentContainer

モデル、コンテキスト、ストア コーディネーターをすべて一度に設定します。
アプリの Core Data スタックをカプセル化するコンテナー。

NSPersistentContainer は、管理オブジェクト モデル (NSManagedObjectModel)、永続ストア コーディネーター (NSPersistentStoreCoordinator)、および管理オブジェクト コンテキスト (NSManagedObjectContext) の作成を処理することにより、コア データ スタックの作成と管理を簡素化します。

NSManagedObjectModel

アプリのタイプ、プロパティ、および関係を説明するアプリのモデル ファイルを表します。
オブジェクトを説明する .xcdatamodeld ファイルのプログラム表現。

モデルには、スキーマ内のエンティティを表す 1 つ以上の NSEntityDescription オブジェクトが含まれています。 各 NSEntityDescription オブジェクトには、スキーマ内のエンティティのプロパティ (またはフィールド) を表すプロパティ記述オブジェクト (NSPropertyDescription のサブクラスのインスタンス) があります。 Core Data フレームワークは、この説明をいくつかの方法で使用します。
Interface Builder での UI 作成の制限
実行時の属性と関係の値の検証
管理対象オブジェクトとデータベースまたはオブジェクト永続性のためのファイルベースのスキーマとの間のマッピング
マネージド オブジェクト モデルは、各エンティティ オブジェクトと、コア データ フレームワークの永続ストレージ メカニズムで使用する対応するマネージド オブジェクト クラスとの間のマッピングを維持します。 エンティティ メソッドを使用して、特定の管理対象オブジェクトのエンティティを決定できます。
通常、マネージド オブジェクト モデルは Xcode のデータ モデリング ツールを使用して作成しますが、必要に応じてプログラムでモデルを構築することもできます。

NSManagedObjectContext

アプリのタイプのインスタンスへの変更を追跡します。
管理対象オブジェクトへの変更を操作および追跡するためのオブジェクト スペース。

コンテキストは、1 つ以上の永続ストアの内部的に一貫したビューを表す関連するモデル オブジェクトのグループで構成されます。 管理対象オブジェクトへの変更は、コア データがそのコンテキストを 1 つ以上の永続ストアに保存するまで、関連付けられたコンテキストのメモリに残ります。 単一の管理対象オブジェクト インスタンスは 1 つのコンテキストにのみ存在しますが、オブジェクトの複数のコピーは異なるコンテキストに存在できます。 したがって、オブジェクトは特定のコンテキストに固有です。

NSPersistentStoreCoordinator

アプリのタイプのインスタンスをストアから保存およびフェッチします。
モデルを使用してコンテキストと永続ストアの通信を支援するコーディネーター。

NSManagedObjectContext のインスタンスは、コーディネーターを使用してオブジェクト グラフを永続ストレージに保存し、モデル情報を取得します。コーディネーターのないコンテキストは、コーディネーターを使用しないとモデルにアクセスできないため、完全には機能しません。コーディネーターは、永続ストアのグループが集約ストアとして表示されるように、管理対象オブジェクト コンテキストにファサードを提供するように設計されています。管理対象オブジェクト コンテキストは、コーディネータがカバーするすべてのデータ ストアの和集合に基づいてオブジェクト グラフを作成できます。
コーディネーターは、並行性を提供するのとは反対のことを行います。つまり、操作をシリアル化します。異なる書き込み操作に複数のスレッドを使用する場合は、複数のコーディネーターを使用します。複数のスレッドがコーディネーターと直接連携する場合、明示的にロックおよびロック解除する必要があることに注意してください。
各コーディネーター (つまりコンテナー) は、管理対象オブジェクト モデルの異なるコピー、つまり異なるバージョンを使用する場合があります。これにより、ファイルのバージョン管理をきれいに扱うことができます。
コーディネーターは、基になるオブジェクト ストアへのアクセスを提供します。オブジェクト ストアを最初に追加するときに (addPersistentStore(ofType:configurationName:at:options:) を使用して)、またはpersistentStore(for:) または persistentStores を使用して、オブジェクト ストアを取得できます。これにより、たとえば、ストアがすでに追加されているかどうか、または 2 つのオブジェクトが同じストアからのものかどうかを判断できます。
migratePersistentStore(:to:options:withType:) を使用して、ある場所から別の場所にストアを移動するか、ストアのタイプを変更します。
永続ストア コーディネーター (setMetadata(
:for:)) を使用して、特定のストアのメタデータを設定できます。

yoshitakayoshitaka

Initialize a Persistent Container

通常、アプリの起動時に Core Data を初期化します。 永続コンテナーを遅延変数として作成し、アプリのデリゲートで最初に使用されるまでインスタンス化を延期します。
新しい Xcode プロジェクトを作成するときに Core Data チェックボックスを選択した場合、テンプレートは AppDelegate にこのセットアップ コードを自動的に含めます。

  1. NSPersistentContainer 型の遅延変数を宣言します。
  2. 永続的なコンテナ インスタンスを作成し、データ モデルのファイル名をそのイニシャライザに渡します。
  3. 永続ストアをロードします。 この呼び出しは、ストアが存在しない場合に作成します。
class AppDelegate: UIResponder, UIApplicationDelegate {
...
    lazy var persistentContainer: NSPersistentContainer = {        
        let container = NSPersistentContainer(name: "DataModel")
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()
...
}

作成された永続コンテナは、モデル、コンテキスト、ストア コーディネータ インスタンスへの参照を、それぞれ managedObjectModel、viewContext、およびpersistentStoreCoordinator プロパティに保持します。
これで、コンテナーへの参照をユーザー インターフェイスに渡すことができます。

自動生成コードのコメント

アプリケーションの永続コンテナ。 この実装は、アプリケーションのストアをロードしたコンテナを作成して返します。 ストアの作成に失敗する可能性のある正当なエラー条件があるため、このプロパティはオプションです。
この実装をエラーを適切に処理するコードに置き換えます。fatalError() により、アプリケーションはクラッシュ ログを生成して終了します。 この関数は、開発時に役立つ場合がありますが、出荷アプリケーションでは使用しないでください。
ここでのエラーの典型的な理由は次のとおりです。
親ディレクトリが存在しないか、作成できないか、書き込みが許可されていません。
デバイスがロックされている場合、パーミッションまたはデータ保護のため、永続ストアにアクセスできません。
デバイスの空き容量が不足しています。
ストアを現在のモデル バージョンに移行できませんでした。
エラー メッセージを確認して、実際の問題を特定します。

Pass a Persistent Container Reference to a View Controller

アプリのルート ビュー コントローラーで、Core Data をインポートし、永続コンテナーへの参照を保持する変数を作成します。

import UIKit
import CoreData
class ViewController: UIViewController {
    var container: NSPersistentContainer!
    override func viewDidLoad() {
        super.viewDidLoad()
        guard container != nil else {
            fatalError("This view needs a persistent container.")
        }
        // The persistent container is available.
    }
}

アプリのデリゲートに戻ります。 application(_:didFinishLaunchingWithOptions:) で、アプリ ウィンドウの rootViewController をアプリのルート ビュー コントローラー タイプにダウンキャストします。 このリファレンスでは、ルート ビュー コントローラーのコンテナー プロパティを永続コンテナーに設定します。

class AppDelegate: UIResponder, UIApplicationDelegate {
 ...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {        
        if let rootVC = window?.rootViewController as? ViewController {
            rootVC.container = persistentContainer
        }        
        return true
    }
 ...
}

永続コンテナを追加のView Controllerに渡すには、各View Controllerでコンテナ変数の作成を繰り返し、その値を前のView Controllerのprepare(for:sender:)に設定します。

class ViewController: UIViewController {
...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nextVC = segue.destination as? NextViewController {
            nextVC.container = container
        }
    }
}

Subclass the Persistent Container

NSPersistentContainer はサブクラス化されることを意図しています。 サブクラスは、データのサブセットを返す関数や、データをディスクに永続化するための呼び出しなど、Core Data 関連のコードを配置するのに便利な場所です。

import CoreData
class PersistentContainer: NSPersistentContainer {    
    func saveContext(backgroundContext: NSManagedObjectContext? = nil) {
        let context = backgroundContext ?? viewContext
        guard context.hasChanges else { return }
        do {
            try context.save()
        } catch let error as NSError {
            print("Error: \(error), \(error.userInfo)")
        }
    }    
}

上記の例では、saveContext 関数をコンテナーに追加して、変更がある場合にのみコンテキストを保存することでパフォーマンスを向上させています。

モデル レイヤーを独自のフレームワークに組み込む場合、NSPersistentContainer サブクラスはモデル ファイルを独自のバンドルに配置します。

yoshitakayoshitaka

Modeling Data

アプリのオブジェクト グラフを含むようにデータ モデル ファイルを構成します。

データ モデルは、アプリケーションのオブジェクトに関する情報と、オブジェクトが互いにどのように関係するかを示すグラフを保持します。 この情報は、プロジェクトの .xcdatamodeld ファイル パッケージで提供します。
オブジェクトをエンティティとして記述し、それらのプロパティを属性と関係として追加し、最後にそれぞれの NSManagedObject サブクラスを生成して変更追跡とライフサイクル管理を継承することにより、データをモデル化します。

yoshitakayoshitaka

Configuring Entities

エンティティは、名前、属性、関係など、オブジェクトを説明します。 アプリのオブジェクトごとにエンティティを作成します。
コア データ モデルの作成の説明に従ってコア データ モデルを作成したら、エンティティをプロジェクトの .xcdatamodeld ファイルに追加します。

  1. エディター領域の下部にある [エンティティの追加] をクリックします。 エンティティ リストにプレースホルダー名 Entity の新しいエンティティが表示されます。

2.[エンティティ] リストで、新しく追加されたエンティティをダブルクリックし、適切な名前を付けます。 これにより、データ モデル インスペクターに表示されるエンティティ名とクラス名の両方が更新されます。

エンティティには、必須の名前とクラス名のフィールドに加えて、必須のコード生成フィールドのデフォルト設定があります。 継承、一意の制約、バージョン管理、またはその他のオプション情報を追加する必要がある場合は、以下の説明に従ってエンティティを構成します。 それ以外の場合は、属性の構成の説明に従って、エンティティを構成するプロパティを追加します。

データ モデル インスペクターを使用して ([表示] > [インスペクター] > [データ モデル インスペクターの表示] を選択) エンティティを構成します。

Entity Name

管理対象オブジェクト モデル内のエンティティの名前。このフィールドには、エンティティ リストに表示される名前が反映されます。

Abstract Entity

エンティティのインスタンスを作成しない場合は、たとえば、直接インスタンス化してはならない親エンティティとしてのみ存在する場合など、「抽象エンティティ」チェックボックスを選択します。デフォルトでは、このオプションは選択されていないため、具体的なエンティティが作成されます。

Parent Entity

類似のエンティティが多数ある場合は、親エンティティで共通のプロパティを定義し、子エンティティにそれらのプロパティを継承させることができます。デフォルトでは、このフィールドは空白です。

Class Name

このエンティティから管理対象オブジェクト インスタンスを作成するときに使用するクラスの名前。デフォルトでは、クラス名はエンティティ名を反映しています。ただし、クラス名を変更すると、変更はエンティティ名に反映されません。

Module

このエンティティのクラスが存在するモジュール。デフォルトでは、Core Data はクラス ファイルをグローバル名前空間に配置します。

Codegen/コード生成

エンティティをサポートする管理オブジェクト サブクラスとプロパティ ファイルを生成するためのコード生成オプションを選択します。デフォルトでは、これは Class Definition に設定されており、Core Data は両方のファイルを自動的に生成します。

Constraints/制約

属性の構成に示すように属性を追加した後、オプションで、エンティティの一意の制約として機能する属性の名前 (または属性のコンマ区切りリスト) を入力します。

一意の制約により、ストア内の重複レコードが防止されます。新しいレコードを保存するとき、ストアは、制約された属性に同じ値を持つレコードが既に存在するかどうかを確認します。競合が発生した場合、NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType により、新しいレコードが既存のレコードのすべてのフィールドを上書きします。

Spotlight Display Name

このエンティティから作成されたインスタンスを表示するために Core Spotlight によって使用される NSExpression。この式には、キーパス、lowercased() やuppercased() などの言語に組み込まれた関数、およびカスタム関数が含まれる場合があります。

User Info

エンティティに関連するアプリケーション固有の情報をオプションで保存できるディクショナリ。

Versioning Hash Modifier/バージョン管理ハッシュ修飾子

エンティティの構造は同じであるが、そのデータのフォーマットまたはコンテンツが変更されている場合、複数のモデル バージョンを維持するときにハッシュ修飾子を提供します。

Versioning Renaming ID/バージョン管理 リネームID

モデル バージョン間でエンティティの名前を変更する場合は、名前変更 ID を指定します。新しいモデルの名前変更識別子を、以前のモデルの対応するエンティティの名前に設定します。

yoshitakayoshitaka

Configuring Attributes

エンティティを構成するプロパティについて説明します。

エンティティの構成の説明に従ってエンティティを作成したら、そのエンティティに属性を追加できます。
属性は、エンティティのプロパティを説明します。 少なくとも、プロパティの名前とデータ型、ストアに保存するかどうか、保存時に値が必要かどうかを指定する必要があります。
一部の属性タイプでは、生成されたクラスで属性を表すためにスカラータイプを使用するかどうか、デフォルト値を持つように属性を構成するか、データ検証ルールを適用するかを選択することもできます。

  1. エンティティを選択した状態で、エディター領域の下部にある [属性の追加] をクリックします。 タイプが未定義のプレースホルダー名属性を持つ新しい属性が [属性] リストに表示されます。

  2. [属性] リストで、新しく追加された属性をダブルクリックし、適切な名前を付けます。

  3. 2 番目のスクリーンショットに示すように、[属性] リストで [未定義] をクリックし、[タイプ] ドロップダウン リストから属性のデータ タイプを選択します。

Transient/一時的な

一時属性は永続ストアに保存されません。デフォルトでは、属性はストアに保存されます。一時属性は、計算値または派生値を一時的に保存する場所として役立ちます。 Core Data は、元に戻す目的で一時的なプロパティ値への変更を追跡します。

Optional

永続ストアに保存するときに、オプションの属性に値を設定する必要はありません。属性はデフォルトではオプションです。
Core Data オプションは Swift オプションと同じではありません。たとえば、オブジェクトの初期化と最初の保存の間の時間に値を設定する柔軟性が必要な場合、Swift オプションを使用して必須属性を表すことができます。

Attribute Type

属性のデータ型。このフィールドには、[属性] リストの [タイプ] ドロップダウンでの選択が反映されます。
タイプの完全なリストについては、NSAttributeType を参照してください。

Default Value

ほとんどのタイプでは、デフォルト値を指定できます。新しいオブジェクト インスタンスは、その時点で別の値を指定しない限り、初期化時に属性をこのデフォルト値に設定します。
タイプを非オプションにすることと組み合わせてデフォルト値を指定すると、パフォーマンス上の利点が得られます。

Validation/検証

オプションで、数値型の最小値と最大値、または文字列の正規表現要件などの検証規則を設定します。データ モデル インスペクターには、選択した属性のタイプに固有の検証オプションが表示されます。

Use Scalar Type/スカラー型を使用

オプションで、一部の型については、コード生成時にスカラー表現と非スカラー表現のどちらかを選択します。 Double の場合、[Use Scalar] チェックボックスを選択すると Double が生成され、選択しないと NSNumber が生成されます。

Index in Spotlight

このエンティティから作成されたインスタンスの Spotlight インデックスにフィールドを追加します。

Preserve After Deletion/削除後に保持

このエンティティの墓石に属性を含めます。永続的な履歴追跡が有効で、管理対象オブジェクトが削除されると、そのトゥームストーンと呼ばれる識別マーカーが関連するトランザクションに記録されます。

User Info/ユーザー情報

属性に関連するアプリケーション固有の情報を格納できるディクショナリ。

Versioning Hash Modifier/バージョン管理ハッシュ修飾子

属性の構造は同じであるが、データの形式または内容が変更されている場合、複数のモデル バージョンを維持するときにハッシュ修飾子を提供します。

Versioning Renaming ID/バージョン管理 リネームID

モデル バージョン間で属性の名前を変更する場合は、新しいモデルの名前変更識別子を以前のモデルの対応する属性の名前に設定します。

yoshitakayoshitaka

Configuring Relationships

エンティティがどのように関連し、変更がそれらの間でどのように伝播するかを指定します。

エンティティの構成の説明に従って少なくとも 2 つのエンティティを定義したら、エンティティ間の関係を追加できます。
関係は、エンティティが別のエンティティにどのように影響するかを示します。 少なくとも、関係は、名前、宛先エンティティ、削除規則、カーディナリティ タイプ (1 または複数)、関係をストアに保存するかどうか (一時的) の設定、および保持する必要があるかどうかを指定します。 保存時の値 (オプション)。 また、すべての関係を逆の関係で構成する必要があります。

Add Relationships

関係を追加するには:

  1. アプリのすべてのエンティティを一度に表示するには、グラフ エディター スタイルを選択します。
  2. 1 つのエンティティから別のエンティティに Control キーを押しながらドラッグして、一対の関係を作成します。 エンティティ間に矢印が表示されて関係が示され、プレースホルダー名 newRelationship の関係が各エンティティに追加されます。

Configure Relationships

関係のペアを作成した後、スクリーンショットとそれに続く手順に示されているように、各関係を構成します。

  1. 一度に 1 つのエンティティを編集するには、テーブル エディター スタイルを選択します。
  2. データ モデル インスペクターを開きます ([表示] > [インスペクター] > [データ モデル インスペクターを表示] を選択します)。
  3. [エンティティ] リストからソース エンティティを選択し、[関係] リストで新しい関係を選択します。 データ モデル インスペクターを使用して、その名前、宛先、反転、削除ルール、およびカーディナリティ タイプを設定し、それが一時的かオプションかを示します。
  4. [エンティティ] リストから宛先エンティティを選択し、[関係] リストで新しい関係を選択します。 データ モデル インスペクターを使用して、その名前、宛先、反転、削除ルール、およびカーディナリティ タイプを設定し、それが一時的かオプションかを示します。

上記の例は、特定の地震の影響を受けた 1 つ以上の国を参照する、Quake エンティティの国の関係を示しています。それは、その国に影響を与えるすべての地震を参照する、quakes と呼ばれる Country エンティティに対して逆の関係を持っています。

Transient/一時的な

一時的な関係は永続ストアに保存されません。これにより、一時的な関係は、計算された値または派生した値を一時的に保存するための便利な場所になります。 Core Data は、元に戻す目的で一時的なプロパティ値への変更を追跡します。

Optional

オプションの関係は、宛先タイプのインスタンスを持つ必要はありません。必要な関係は、宛先タイプの 1 つ以上のインスタンスを指している必要があります。

Destination

各関係は、ソース エンティティ (編集している関係を持つエンティティ) から宛先エンティティを指しています。宛先エンティティは、ソース タイプに影響を与える関連タイプであり、ソース タイプによって影響を受けます。
同じソース タイプと宛先タイプを設定すると、反射的な関係が作成されます。たとえば、従業員は別の従業員を管理できます。

Inverse/逆

逆の関係により、ソースまたは宛先タイプのインスタンスが変更されたときに、コアデータが両方向に変更を伝播できます。すべての関係には逆の関係が必要です。

グラフ エディタで関係を作成する場合、単一の手順でエンティティ間の逆の関係を追加します。テーブル エディターで関係を作成するときは、各エンティティに逆の関係を順番に追加します。

Delete Rule

関係の削除ルールは、ソース インスタンスが削除されたときに変更が関係全体に伝播する方法を指定します。

ソース オブジェクト インスタンスを削除するには、[アクションなし] を選択しますが、手動で更新する宛先オブジェクト インスタンスにはその参照を残します。

[Nullify] を選択してソース オブジェクト インスタンスを削除し、すべての宛先オブジェクト インスタンスでそれへの参照を無効にします。

[カスケード] を選択して、ソース オブジェクト インスタンスを削除し、それとともにすべての宛先オブジェクト インスタンスを削除します。

宛先オブジェクト インスタンスを指していない場合にのみソース オブジェクトを削除するには、[拒否] を選択します。

Cardinality Type

カーディナリティとして知られる、1 対 1 または複数の関係を指定します。

To One 関係を使用して、ソースを宛先タイプの単一インスタンスに接続します。

To Many 関係を使用して、ソースを宛先タイプの可変セットに接続し、オプションで配置と数を指定します。

配置: 順序付けチェックボックスを選択して、関係に固有の順序付けがあることを指定し、順序付けられた可変セットを生成します。

カウント: 宛先インスタンスの数に上限と下限を設定することもできます。オプションの関係の場合、インスタンスの数はゼロまたはこれらの境界内にある可能性があります。

Index in Spotlight

このエンティティから作成されたインスタンスの Spotlight インデックスにフィールドを追加します。

yoshitakayoshitaka

Generating Code

エンティティから管理対象オブジェクトのサブクラスを自動または手動で生成します。

コア データ モデルの構成の説明に従ってエンティティ、その属性、および関係を定義したら、エンティティのインスタンスの作成に使用するクラスを指定します。 Core Data はオプションで、クラスをサポートする 2 つのファイル (クラス ファイルとプロパティ ファイル) を生成します。

クラスおよびプロパティ ファイルをいつでも再生成するには、[エディター] > [NSManagedObject サブクラスの作成] メニュー オプションを選択します。 新しいファイルは、ターゲットの場所にある既存のファイルを上書きすることに注意してください。

このスクラップは2021/03/05にクローズされました