みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

obj-c iOSのローカルディスク上にデータ保存

Objective-Cを勉強し始め、とりあえず自分で考えたiOS(iPhone/iPad)上で動くシンプルなプログラムを作成したいと思っています。

テキストフォーム欄に入力された文字列を、「保存」ボタンを押したら、iOS(iPhone/iPad)のハードディスク上にテキストファイルとして保存し、「読み込み」ボタンを押して、そのファイルの内容をテキストフィールド上に表示させる、というだけのものです。一旦iPhone/iPad の電源を落としても、その情報が記録されているという様にしたいです。

購入した書籍などにはNSDefaultというクラスを使ってメモリ上には保存できるようなことが紹介されているのですが、データをローカルに保存する方法が載っていません。

Webで検索をかけたところ、NSFileManager クラスを使用する、という記述を見かけます。しかし、Macのアプリ用に書かれていてiOS用ではないらしく、保存場所のパスが正しいのかよくわかりません。

上記のようなプログラムを書くにあたり、どのような方法がよいでしょうか?この本やサイトに載っていたよ、という情報でも構いません。お詳しい方いらっしゃいましたら、何かアドバイスをいただければと思います。

投稿日時 - 2011-06-27 20:03:06

QNo.6839169

暇なときに回答ください

質問者が選んだベストアンサー

ディレクトリの操作を行うクラスを、NSFileManagerといいます。それとは別に、ファイルオープン、クローズ、リード、ライトを行うクラスを、NSFileHandleといいます。

NSFileManager
http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html#//apple_ref/occ/cl/NSFileManager
NSFileHandle
http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSFileHandle_Class/Reference/Reference.html#//apple_ref/occ/cl/NSFileHandle
Low-Level File Management Programming Topics
http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Introduction.html#//apple_ref/doc/uid/10000055i

しかし、よりかんたんにファイルの読み書きができるメソッドが、NSStringに用意されているので、そちらを使ったほうがいいでしょう。

NSString
http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/
ファイル読み出し
- (id)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error
ファイル書き込み
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error

iOSでは、ユーザが読み書きできるディスク上の領域が、アプリごとに決まっています。
ホームディレクトリを取得する関数。
NSString * NSHomeDirectory (void)
書類ファイルを保存する場所は、Documentsフォルダと決まっています。Documentフォルダのパスを取得するには、次のコードを使います。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if ([paths count] > 0) {
NSString *userDocumentsPath = [paths objectAtIndex:0];
}

※「NSDefault」は、NSUserDefaultsのことだと思いますが、これはアプリの環境設定ファイルにアクセスするクラスです。書類の読み書きとは、性質が異なります。

投稿日時 - 2011-06-27 21:24:52

補足

詳しく教えてくださってありがとうございます。

試しにNSStringクラスでファイルの読み書きに挑戦してみようと思います。

その後、自分でWeb検索を続けた結果、StackOverflow のフォーラムでアップグレード時にデータが失われるのを防ぐために、アプリケーションのDocumentsフォルダに保存したほうがいい、というような投稿を見つけました。http://stackoverflow.com/questions/307313/best-way-to-save-data-on-the-iphone あとsqliteを使うのも良い、という記述も見かけました。

将来的には、iPhone/iPadを放置しておいて、バックグラウンドでデータを作成し、1日毎に指定のメールアドレスにそのファイルを送信する、もしくはサーバにアップロードする、というような事が目的です。

そのファイルのデータ解析をWindowsの方でする予定なので、データのフォーマットに互換性を持たせたいのですが、(例えばcsvファイルとかxmlファイルとか)、sqliteでも問題ないのでしょうか?

重ねての質問になりましたので、お暇なときにでもご回答いただければ幸いです。

投稿日時 - 2011-06-28 00:29:37

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> そのファイルのデータ解析をWindowsの方でする予定なので、データのフォーマットに互換性を持たせたいのですが、(例えばcsvファイルとかxmlファイルとか)、sqliteでも問題ないのでしょうか?

NSStringを直接ファイル保存すると、プレーンテキストになりますので、OSに依存しないテキストファイルになります。とうぜん仕様に沿って、テキストを成形すれば、CSVになります。
XMLで書き出すこともできます。

Serialization
http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Articles/serializations.html#//apple_ref/doc/uid/20000947-BCIEBEGI

NSPropertyListSerialization Class Reference
http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSPropertyListSerialization_Class/Reference/Reference.html#//apple_ref/occ/cl/NSPropertyListSerialization

SQliteのことはわかりません。

投稿日時 - 2011-06-28 01:03:35

ANo.1

NSData クラスの
writeToFile:atomically: でファイルへの書き込み
dataWithContentsOfFile: でファイルからの読み込み
が可能です。

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html

読み書き可能なフォルダは、アプリケーションのホーム ( NSHomeDirectory() で取得可能 ) 直下の

Documents
tmp
Library/Preferences

に限定されるようです。


あと、NSUserDefaults が便利でいいんじゃないかと思います。
http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003764
http://iphone-dev.g.hatena.ne.jp/tokorom/20090520/1242789479

投稿日時 - 2011-06-27 21:19:03

補足

ありがとうございます。大変参考になります。

NSHomeDirectory()、使い方がまだまだわからないのですが、調べてみます。

重ねてお尋ねしたいのですが、NSUserDefaultsクラスはiPhoneの電源が切れて再度起動しなおしたときにもデータは残るのでしょうか?

投稿日時 - 2011-06-28 00:11:53

あなたにオススメの質問