dポイントプレゼントキャンペーン実施中!

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

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

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

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

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

A 回答 (3件)

ディレクトリの操作を行うクラスを、NSFileManagerといいます。

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

NSFileManager
http://developer.apple.com/library/ios/documenta …
NSFileHandle
http://developer.apple.com/library/ios/documenta …
Low-Level File Management Programming Topics
http://developer.apple.com/library/ios/documenta …

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

NSString
http://developer.apple.com/library/ios/documenta …
ファイル読み出し
- (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のことだと思いますが、これはアプリの環境設定ファイルにアクセスするクラスです。書類の読み書きとは、性質が異なります。

この回答への補足

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

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

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

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

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

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

補足日時:2011/06/28 00:29
    • good
    • 0

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



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

Serialization
http://developer.apple.com/library/ios/documenta …

NSPropertyListSerialization Class Reference
http://developer.apple.com/library/ios/documenta …

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

NSData クラスの


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

http://developer.apple.com/library/ios/#document …

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

Documents
tmp
Library/Preferences

に限定されるようです。


あと、NSUserDefaults が便利でいいんじゃないかと思います。
http://developer.apple.com/library/ios/#document …
http://iphone-dev.g.hatena.ne.jp/tokorom/2009052 …

この回答への補足

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

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

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

補足日時:2011/06/28 00:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!