質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1173閲覧

CoreDataで並び順を保存したい

SdMzauVsdtgq81B

総合スコア1

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/06/24 11:25

編集2021/06/28 09:47

前提・実現したいこと

CoreDataで並び順を保存したい。ただし重複を許容したい。

実現したいことの詳細

「フォルダ」と「メモ」というエンティティがあり、フォルダ内のメモを並び替えができるようにして、その並び順を保存したいです。relationshipは、フォルダの中に複数のメモを入れることができるように、多対多の関係になってます。ただ、同じフォルダに同じメモを入れることができるようにしたいです。

試したこと,発生している問題

以下の2つの方法を試しましたが納得のいく結果が得られませんでした。

①ArrangementのOrderdにチェックマークを入れる

イメージ説明
Orderdにチェックマークをつけることで、一応は順番が保存できました。ただし、この方法で用いるはNSOrderedSetは、「重複した要素は保存しない」という特徴があるらしく、同じメモを同じフォルダに複数入れることができませんでした。重複できるようにしたいのでこの方法は断念しました。

②並び順を表すIDを「メモ」エンティティに作る。

この方法を実装してる途中で、この方法だと、フォルダごとにメモに異なるIDを割り振れないことに気づきました。つまり、複数のフォルダに、とある1つのメモを入れたときに順番に不都合が生じるだろうということです。

CoreDataで重複を許して並び順を保存できる方法をご存じの方はいらっしゃいませんでしょうか?

追記

Realmのドキュメントから抜粋したものを用いて補足説明致します。

RealmのListの説明を抜粋したもの
Listオブジェクトは同じ(プライマリキーが同じオブジェクトであっても)Realmオブジェクトを複数格納できます。例えば、最初に空のListオブジェクトを作り、そのあと同じオブジェクトを3回に渡って追加したとします。するとListオブジェクトには同じオブジェクトがそれぞれ0番目、1番目、2番目に格納されます。

これと同じようなことをCoreDataで実現したいです。
重複というのは、同じフォルダーに同じメモを入れれるようにしたいということです。現状だと、主キーが同じメモは同じフォルダーに入れれませんでした。
コードを見せてもらわないと、これ以上はコメントできないという場合はおっしゃってください。コードを追記致します。

補足情報(FW/ツールのバージョンなど)

swift5.4
RealmのListを使えば重複を許して順番を保存することができるのはわかりますが、後でCoreDataとCloudKitを連携させる予定なので、Realmは却下しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AOKINAO

2021/06/25 03:48

Core Dataは、Orderdであろうと無かろうとデータの重複は許されませんが、この場合の重複とはどういう状況を指すのでしょうか。
SdMzauVsdtgq81B

2021/06/25 05:09

追記したのでそちらをご覧ください。
AOKINAO

2021/06/25 06:29

重複ということは、0番目のオブジェクトを修正すると1番目、2番目のデータも自動的に修正される、ということだと思いますが、そうなるとCore Data単体の機能ではできないと思います。エンティティに重複を判断するアトリビュートを付加し、オブジェクトを修正するたびに重複しているオブジェクトを検索して修正するプログラムを自作する必要があると思います。
SdMzauVsdtgq81B

2021/06/25 06:55

なかなか難しそうですね。RealmとCoreDataどちらも一長一短があることがわかり、良い勉強になりました。残念ですが、重複を許容するのは諦めたいと思います。ありがとうございました。
MasakiHori

2021/06/28 01:50

FolderがMemoを直接持たずにたとえばMemoAliasみたいなものを作ってFolderはMemoAliasをもつ、複数のMemoAliasが同じMemoを持つことができる、ようにすればできそうな気がしますね。 Relationshipが面倒くさいことになりますが。
SdMzauVsdtgq81B

2021/06/28 10:08

中間テーブルに、①「index」、②「フォルダーに対するto OneのRelationship」、③「メモに対するto OneのRelationship」を作ったらいけそうですね。おっしゃるとおりRelationshipが面倒ですが、頑張って実装したいと思います。コメントありがとうございます。
guest

回答1

0

自己解決

中間テーブルを作って、そこに順番を決めるidを保存することで実装できました。重複するものについてはuuidで区別しました。

投稿2021/06/25 06:58

編集2021/07/02 08:16
SdMzauVsdtgq81B

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問