- ベストアンサー
Objective-C iOSのローカルディスク上にデータ保存
- Objective-Cを使ってiOSのローカルディスク上にデータを保存する方法について教えてください。
- iPhone/iPad上で動作するシンプルなプログラムを作成する際、テキストファイルとしてデータを保存し、再度読み込む方法を知りたいです。
- NSFileManagerクラスを使用してデータをローカルに保存する方法について詳しく教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ディレクトリの操作を行うクラスを、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のことだと思いますが、これはアプリの環境設定ファイルにアクセスするクラスです。書類の読み書きとは、性質が異なります。
その他の回答 (2)
- harawo
- ベストアンサー率58% (3742/6450)
> そのファイルのデータ解析を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のことはわかりません。
- tsukasa-12r
- ベストアンサー率65% (358/549)
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
補足
ありがとうございます。大変参考になります。 NSHomeDirectory()、使い方がまだまだわからないのですが、調べてみます。 重ねてお尋ねしたいのですが、NSUserDefaultsクラスはiPhoneの電源が切れて再度起動しなおしたときにもデータは残るのでしょうか?
補足
詳しく教えてくださってありがとうございます。 試しに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でも問題ないのでしょうか? 重ねての質問になりましたので、お暇なときにでもご回答いただければ幸いです。