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

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

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

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

Q&A

解決済

2回答

365閲覧

【iOS,swift4】Discのjsonデータを一つだけ消したい場合

ybkm

総合スコア11

Swift

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

0グッド

1クリップ

投稿2017/12/29 06:14

編集2018/02/12 09:52

###前提・実現したいこと
こんにちは
swift4から使えるようになったDiscで、.jsonに保存する場合は
Disk.appendでobjectを一つずつ追加できるのに、一つずつ削除する方法がわかりません。

####環境
Xcode 9.2
swift4
Disc 0.3.3

###前提となるDiscの登録(https://github.com/saoudrizwan/Disk参考)

###ViewController.swift

class ViewController: UIViewController { // MARK: Properties var posts = [Post]() @IBAction func saveTapped(_ sender: Any) { do { try Disk.save(self.posts, to: .documents, as: "posts.json") } catch let error as NSError { // エラー処理 } for i in 1..<5 { let newPost = Stock(userId: i , id: "id(i)", title: "title(i)", body: "body(i)") try? Disk.append(newPost, to: "posts.json", in: .documents) } }

###Post.swift

import Foundation struct Post: Codable { let userId: Int let id: Int let title: String let body: String }

###やりたいこと

この後posts.jsonに入っているuserId:3のオブジェクトを削除したいのですが
Discのremoveには.jsonごと削除しか用意されてないようで、どのようにすれば簡単に一つだけ削除できるかわかりません。

####Disc.remove

/// - Parameters: /// - path: path of file relative to directory /// - directory: directory where file is located /// - Throws: Error if file could not be removed static func remove(_ path: String, from directory: Directory) throws { do { let url = try getExistingFileURL(for: path, in: directory) try FileManager.default.removeItem(at: url) } catch { throw error } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

swift

1//id=3を削除 2do { 3 try Disk.save(posts.filter {$0.id != 3}, to: .documents, as: "posts.json") 4} catch let error { 5 print(error.localizedDescription) 6}

あとは、追加/削除の最小単位でファイルを分けるか。

投稿2018/01/09 04:23

fuzzball

総合スコア16731

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

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

ybkm

2018/01/14 13:20

ご回答ありがとうございます。 正規の方法はいまのDiscバージョンではなさそうですので、ご案内いただいた内容もしくはコメントの「追加/削除の最小単位でファイルを分けるか。」しかなさそうです。 私は「追加/削除の最小単位でファイルを分ける」方法を選択しました。 ファイルは多くなってしまうのは余り美しくないですが let name = nameTextField.text try? Disk.append(newStock, to: "MyApp/(name).json", in: .documents) のようにディレクトリを切ることで煩雑になりすぎないようにしました。
guest

0

https://dev.classmethod.jp/smartphone/ios-oss-disk/

Diskというものがあるんですね。こちらを参考にしたのですが、
多分おっしゃったことはできないように思います。
あくまで.jsonファイルを作成して、保存してくれるだけであって、それ以降は.jsonファイルとしてしか扱えません。.jsonファイルの中の、ある記述?だけ削除するというのはできないと思います。(←ここをオブジェクトを削除してと表現されていたと思うのですが、.jsonはファイルなのでオブジェクトではないです。

でそうなってきた時に、jsonファイルを編集できるような方法ないかなと思ったんですがそれもなさそうなので、現状難しいのではないでしょうか?

投稿2017/12/30 10:01

komo_ta

総合スコア275

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

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

ybkm

2017/12/30 12:25

ご回答ありがとうございます。 やっぱり出来ないですよね。。。 Disc.appendではPostオブジェクトを追加出来るので、削除もなんとかできないかな?と思ったのですがむずかしそうですね。もう少しDiscの中読んでいい方法考えてみます。 オブジェクトの語弊失礼しました。構造体の1データをさしておりました。
komo_ta

2017/12/30 12:59

Diskライブラリは、オブジェクトとしてデータを保存するのではなく、ファイルとして保存するようなので、それが保存された後はオブジェクトとしての扱いというより、ただのファイルとしてみたほうがいいのかなと思いました。 「オブジェクトを削除する」というのは、あくまでオブジェクトとして保存されているのが前提の話なので、そこに少し違和感を感じた次第です。 Diskライブラリを使うことで、ファイルとしても保存しかつオブジェクトとしても保存する機能があれば別ですが、そうではなさそうなので。 話をちょっとわかりづらくしてたらすみません。。。
ybkm

2017/12/30 15:25 編集

いえいえ、とても親切にありがとうございます。 .jsonオブジェクトをファイルとしてローカルデータに保存した時点で、データとしての扱いは不可能って考えたほうがいいってことですよね。なんならただのtextとして考えた方がいいってことですよね。 ただCodableに準拠したオブジェクトなら、その構造のままjson形式でsaveできるしapendでき、その構造でretrieveしてオブジェクトに放り込めるので、あわよくば出来るのでは、と期待を抱いてました。(感覚としてご説明いただいた「ファイルとしても保存しかつオブジェクトとしても保存する機能」をうまいことやってくれんじゃねーか、って思った感じです)
komo_ta

2017/12/30 14:07

retriveというものそこまで見れてなかったです。m(_ _)m そうですね、そのretriveの際に.jsonの記述からまたobjectにするのと思うので、それまではローカルにはデータはないかと思います。 ただretrieveしながら更新削除とかよしなにやってくれそうな感じは確かにありそうですね... あまりお役に立てずすみません!m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問