XcodeでSQLiteファイルを開けない

このQ&Aのポイント
  • iPhoneプログラミング開発でカレンダーの予定データなどを管理するためにデータベースを使ったアプリを使いたく、SQLiteの勉強をしているのですが、エラーが出てうまく処理できません。
  • 参考にしたページでコードの追加やライブラリの追加に問題はないと思いますが、実行すると「error opening! :14」というエラーが表示され、データベースが正しく作成されていないようです。
  • 以下にコードを添付しますが、どこが間違っているか教えていただけると助かります。
回答を見る
  • ベストアンサー

XcodeでSQLite ファイルを開けない

iPhoneプログラミング開発でカレンダーの予定データなどを管理するために データベースを使ったアプリを使いたく、SQLiteの勉強をしているのですが、エラーが出てうまく処理できません。 http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90iphone%E3%82%A2%E3%83%97%E3%83%AA%E3%80%91sqlite%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%81fmdb%E3%80%81lita/ 上記のページを参考にプログラムしましたが、 「error opening! :14」 「DB error : 14 "unable to open database file"」 と表示されてしまい、データベースがうまく作成されていないように思います。 コードの実行はできます。 上記のサイトで「SQLiteを使用するためのライブラリ「libsqlite3.0.dylib」を追加」という項目までは間違いなく出来ていると思うので、コードで間違っていると思われます。 以下にコードを晒します。(ヘッダファイルは何も処理を加えていません。) ■ViewController.m http://www.dotup.org/uploda/www.dotup.org4912827.txt よろしくお願いします。

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

  • ベストアンサー
回答No.2

No.1です。 > makeDataボタンを押すと、error openingと表示されます。 最初にこれを書いてくれればすぐわかりました。 もともとの質問にはmakeDataボタンを押したらエラーが出る なんて書いてないじゃないですか。 (makeDataボタンを押したらどんな処理が動作するのか 今回の補足でも明確には書かれていませんが、 makeDataメソッドが呼ばれるようになっているのですよね?) そういう説明を何もせずにURLのページを参考にプログラムした としか書いてないので、最初のviewDidLoadメソッドの実行でエラーが 出て困っているのかと思ってました。 (makeDataメソッドについては何も説明がないし、どこかから呼ばれている ようにも見えなかったので、質問とは関係ない作りかけのメソッドだと 思ってました。) それで、viewDidLoadのコードに対して「おかしそうなところは わかりませんでした」と回答しました。 で、makeDataメソッドの話であれば、補足で書かれている通り FMDatabase *db = [FMDatabase databaseWithPath:@"tests.db"]; がまずいです。 viewDidLoadの方は FMDatabase *db = [FMDatabase databaseWithPath:db_path]; と書いてますよね。 db_pathは、その手前の処理で「tests.db」というファイル名に パス名をくっつけたものを設定していますよね。 このようにパス名をくっつけたものを指定しないとダメです。 要はviewDidLoadに書かれてあるdb_pathを求める処理3行を そのまま書いてdb_pathを求め、それを指定すればいいんですが、 複数箇所で同じような処理が何度も必要なら、そういう処理を 別のメソッドで共通化してもよいし、そのdb_pathを インスタンス変数かプロパティに覚えておいて後で 使ってもいいです。 ただ、ちょっとおかしいのは > NSLog(@"%@",db_path);で表示されるパスは確認したところ、存在しませんでした。 > iPhone Simulatorというフォルダから先がありませんでした。 という点です。 これ本当にそうですか? 通常、どの環境でもiPhone Simulatorのフォルダの下にiOSのバージョン番号の フォルダがあって、その下に「Applications/(アプリ識別子)/Documents」 というフォルダがあるはずなのですが。それで、そのDocumentsフォルダの中に tests.dbというデータベースファイルができているはずです。 そのフォルダがなかったら、プログラムじゃなくてシミュレータが おかしいということになります。 > あるいは、そのデータファイルはLitaでないと見れないのでしょうか? > SQLite Database Browserを使っています。 LitaじゃなくてもMacで動作するSQLiteデータベース参照ツールがあれば なんでもいいです。あなたがそのURLを参考に作っていると言っていたので そこに書かれてある通りLitaで確認しましたか?と聞きました。 言いたかったのは、データベースが正常に作成されていることを ちゃんと確認しましたか? ということです。 > コードを実行できるとは言わないのですね^^; いえ、「コードを実行できる」は言います。 ただ「コードを実行できる」だけじゃ、何がどこまで実行できたのか さっぱりわからないんです。あなたの説明ではコードは実行できる けどエラーメッセージが出るとしか書いてなくて、viewDidLoadが 実行できないのかと思ってみたら、そこはおかしそうなところが なかったので、「コードを実行できる」というのは、どこまで実行できたの? データベースが正常に作られたことは確認したの?って聞きたかったのです。 今回は、makeDataメソッドでエラーメッセージが出たと言えばすぐわかる話です。

ifonesapp
質問者

お礼

早い回答ありがとうございます! 説明不足すみません。 storyBoardを使っていることを書き忘れていました。 >(makeDataボタンを押したらどんな処理が動作するのか 今回の補足でも明確には書かれていませんが、 makeDataメソッドが呼ばれるようになっているのですよね?) そのとおりです。 同様にopenDataボタンもあり、ボタンを押すとopenDataメソッドが実行され、InsertしたデータベースをLogに表示するようになっています。 最初プロパティ宣言した変数でパスを保持して、それを使いまわす方法でやってみましたが、それだとFMDBフォルダ内に追加したソースコード上でアクセスエラーが出てしまったので、db_pathを求める処理3行をメソッド化した処理を組んだところ、上手くいき InsertしたデータをNSLogできちんと表示することができました! あと、iPhone simulatorフォルダが見つからなかったのですが、OSがLionだとデフォルトでは表示されていない?ようで、隠しフォルダのようになっているとのことでした。 それを表示したところ、iPhone simulator以下を辿ってtests.dbまでたどり着けました。 (確認できたのが、コードを適切に書き直した後だったので、質問した時点でデータベースが作成されていたのかは不明です・・・)

その他の回答 (1)

回答No.1

> 「error opening! :14」 > 「DB error : 14 "unable to open database file"」 > と表示されてしまい、データベースがうまく作成されていないように思います。 > コードの実行はできます。 ぱっと見では、コードのおかしそうなところはわかりませんでした。 私はSQLiteをそのFMDBライブラリ経由で使ったことはないので 状況があまりよくわかってないのですが、「コードの実行はできる」 というのは、何を意味していますか? もし、エラーメッセージは出ているけど、参考にしたWebサイトに書かれている通り、 そのコードを実行したらDocumentsフォルダに「tests.db」ができていて、 LitaでDBを開いたらmembersというテーブルが存在していることまで確認できている ということだったら、データベース生成は成功しているので、表示されたエラーメッセージは、 気にしなくてよいと思います。 もし「tests.db」ファイルが存在しないのなら、表示メッセージはやはりエラーメッセージで、 どこかでデータベースパス名の設定処理を間違えたのだろうと思います。 NSLog(@"%@",db_path); のログ出力処理で、使用するDBファイルのパス名が表示されていると思いますが、 そのフォルダ名部分は実際に存在するフォルダ名になっていますか? 最終的には、 [db open]; でFMDBライブラリのopenメソッドが呼ばれ、 その中で実行している int err = sqlite3_open([self sqlitePath], &_db ); がエラーになったのだと思いますので、そこまで1stepずつ実行して 変数の状況を確認すれば、何が悪いかわかると思います。

ifonesapp
質問者

補足

回答ありがとうございます! NSLog(@"%@",db_path);で表示されるパスは確認したところ、存在しませんでした。 iPhone Simulatorというフォルダから先がありませんでした。 まず、ファイル作成から正しくできていないようですね。 makeDataメソッドの FMDatabase *db = [FMDatabase databaseWithPath:@"tests.db"]; の中で、"tests.db"とだけ書いてますが、これがいけないような気がしてます。 他のサイトも参考にして、別の書き方も試していますが、どこも FMDatabase *db = [FMDatabase databaseWithPath:@"データベースのパス"]; のように書いてあり、データベースのパスをどのような記述をすれば良いのか、分かりませんでした。 何度か試してコードが通らず、"tests.db"と記入したらエラーが消えたので、これで良いのかと思って書いていたと思います。。 Users/ユーザー名/Library...と全て記入するのでしょうか? 自分でデータを用意しておくのではなく、アプリの上でデータを作成し、それを管理したいと思っています。 デバッグすると、まず作成されたファイルのパスがNSLogで表示されます。(が、そのファイルが存在していない。) makeDataボタンを押すと、error openingと表示されます。 あるいは、そのデータファイルはLitaでないと見れないのでしょうか? SQLite Database Browserを使っています。 コードを実行できるとは言わないのですね^^; デバッグ出来るというのが正しい言い方ですかね? プログラミング用語は難しいです… オブジェクトだとかインスタンスだとか・・・あいまいな認識のままでやっています

関連するQ&A

  • 画面遷移したVCから戻る時に元のVCにデータを渡す

    ObjectiveCを用いてiPhoneアプリ製作の勉強をしています。 ViewController上に設置したボタンで接続したTableViewControllerのセルをタッチしたとき、 そのセルの情報を元のViewControllerのラベルに表示するという処理を組みたいのですが、うまく行きません。 こちらのサイトを参考にしています。 http://kikuchy.hatenablog.com/entry/2013/11/04/Segue_%E3%81%A7%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E6%B8%A1%E3%81%97%E3%81%A6%E3%81%BF TableViewControllerのセルがタッチされた時、prepareForSegueメソッドの中のLogが表示されないので、このメソッドが実行されていないように思います。 以下にコードを晒します。 ViewController.m上でproperty宣言されているUILabel *rowNumはストーリーボード上で ViewControllerと接続されています。 ■ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property NSInteger rowNumber; @end ■ViewController.m http://www.dotup.org/uploda/www.dotup.org4992395.txt ■selectTableViewController.h http://www.dotup.org/uploda/www.dotup.org4992392.txt ■selectTableViewController.m http://www.dotup.org/uploda/www.dotup.org4992394.txt よろしくお願いします。

  • SQLiteでデータをアプリから追加する方法

    ObjectiveCを用いてiPhoneアプリ製作の勉強をしています。 SQLiteを使って、データをアプリから追加したいのですが、その処理をするコードの記述方法が分かりません。 NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);"; NSString *insert_sql = @"INSERT INTO members (year,month,day) VALUES(?,?,?)”; NSString *select_sql = @"SELECT year,month,day FROM members”; 特に以上3行の処理の記述方法が分からず、自分なりに考えてこのように記述し試してみましたが storyboard上に追加したボタンを押してDataMakeメソッドを実行するときに ”EXC_BAD_ACCES”というエラーが出てしまいました。 以下にコードを晒します。 ■ViewController.h yearF,monthF,dayFをプロパティ宣言しています。 ■ViewController.m #import "ViewController.h" #import "FMDatabase.h" @interface ViewController () - (IBAction)DataMake:(id)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *db_path = [self sqlmethod]; NSLog(@"%@",db_path); FMDatabase *db = [FMDatabase databaseWithPath:db_path]; NSString *sql = @"CREATE TABLE IF NOT EXISTS members (year INTEGER PRIMARY KEY,month INTEGER,day INTEGER);"; [db open]; [db executeUpdate:sql]; [db close]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (NSString*) sqlmethod{ NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *dir = [paths objectAtIndex:0]; return [dir stringByAppendingPathComponent:@"dayData.db"]; } - (IBAction)DataMake:(id)sender { NSString *db_path = [self sqlmethod]; FMDatabase *db = [FMDatabase databaseWithPath:db_path]; NSString *insert_sql = @"INSERT INTO members (year,month,day) VALUES(?,?,?)"; _yearF = 2014; _monthF = 3; _dayF = 23; [db open]; [db executeUpdate:insert_sql,@"%d",_yearF,@"%d",_monthF,@"%d",_dayF]; [db close]; [self dataopen]; } -(void)dataopen { NSString *db_path = [self sqlmethod]; FMDatabase *db = [FMDatabase databaseWithPath:db_path]; NSString *select_sql = @"SELECT year,month,day FROM members"; [db open]; FMResultSet *result = [db executeQuery:select_sql]; while ([result next]) { int result_year = [result intForColumn:@"year"]; NSLog(@"recodeyear[%d]",result_year); } } @end 以下のリンクを参考にし、”SQLiteを使用するためのライブラリ「libsqlite3.0.dylib」を追加”という項目までは出来ています。 http://blog.oukasoft.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/%E3%80%90iphone%E3%82%A2%E3%83%97%E3%83%AA%E3%80%91sqlite%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%81fmdb%E3%80%81lita/

  • Xcodeでカスタムセルを実装できない

    ObjectiveCを用いてiPhoneアプリ開発の勉強をしています。 http://ameblo.jp/iichin0708/entry-11340165016.html UITableViewに表示するセルをカスタムセルにしたく、上記のサイトを参考にしているのですが上手くいきません。 まずSingleViewControllerを選択し、UITableViewとTableViewCellをstoryboardのViewController上にドラッグアンドドロップし、UITableViewとViewControllerの実行ファイルをOutlet接続しました。 以降は上記サイトを参考にプログラムしました。(xibのクラス名と、ヘッダ・実装ファイル名はtestCellという名前にしました。) xibの実装ファイルに最初から書かれていたコードは残したままにしました。(コメントアウトしても結果は変わりませんでした。) これで実行したところ、unsupported Configuration prototype table cells must have reuse identifiers というエラーが出てシミュレータが起動しませんでした。 なので、storyboardのセルを選択し、Identifier inspector を開き、CustmCellをtestCellに、IdentityをCellにしたらシミュレータが起動できましたが、何も項目は表示されませんでした。 カスタムセルのサイズを縦に極端に大きくしても変化が無かったのでうまく接続できていないように思います。 以下にコードを晒します。 ■testCell.h http://www.dotup.org/uploda/www.dotup.org4973490.txt ■testCell.m http://www.dotup.org/uploda/www.dotup.org4973493.txt ■ViewController.h 特に編集していません。 ■ViewController.m http://www.dotup.org/uploda/www.dotup.org4973496.txt よろしくおねがいましう。

  • SQLiteに関する質問

    JavaとSQLiteを使ったアプリケーションを作成しています。 そこで何点か疑問に思う事がありましたので、質問させてください。 1. エラーの種類の判定について SQLiteは他のDBと異なり、エラーコードを返さないと聞きました。 その場合、エラーの種類はどのように判定するのでしょうか。 2.バインド COBOLなどでは、データベースにバインドと言う処理を行いますが、SQLiteではバインドの機能はあるのでしょうか。 以上よろしくお願いいたします。

  • エラーの定義が分かりません。

    http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%BC%E5%BF%98%E5%8D%B4%E5%9E%8B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0 上記ページの内容を読みました際に、 私の更なる誤解の存在を私は自覚しましたので、伺います。 「たとえ『データの不整合』に対しましてのエラー処理を実施しませんでしても、 (データ等の)安全性が維持され得るのでしょうか?」

  • アクセスもリレーショナルデータベースマネジメントシ

    アクセスもリレーショナルデータベースマネジメントシステムですか? http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0 を見ると、 「エドガー・F・コッドが提唱した関係モデル(リレーショナルモデル)に基づいた、コンピュータのデータベース管理システム (DBMS) である。 」 との事ですがaccessもそうなのでしょうか?

  • APIの意味がさっぱり分かりません。

    VBAでたまにAPIと言うのを使うのですが APIの意味がさっぱり分かりません。 私がAPIを使う際は、 やりたい事をググり、見つかったページのコードをコピペしているだけです。 https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9 を読んでみたのですが よくわかりません。 簡単に言うとなんなんでしょうか? プログラミングコードではないという事はわかりました。

  • FMDBでno such columnのエラー

    ObjectiveCを用いてiPhoneアプリ製作の勉強をしています。 ■[objective-C][iPhone]Objective-Cで簡単にsqliteが使えるFMDBについて調べてみた http://grandbig.github.io/blog/2013/11/30/fmdatabase/ 上のサイトを参考にして、以下のようにコードを書きました。 構造として、ViewController上に設置したボタンを押すと、dataMakeメソッドが実行されてデータをINSERTするようになっています。 しかし、ボタンを押してdataMakeメソッドが実行された時に、DB Error: 1 "no such column : user01"というエラーが表示されてしまい、dataOpenメソッドのNSLogが表示されませんでした。 なので、dataOpenメソッドが実行されているのか、どうなのか分かりません。 データベースは確認したところ、作成されていました。しかし、入力したデータが保存されているかはわかりません。 どのようにしたら、エラーを回避し、データをLog表示して確認できるでしょうか? 試しにUPDATEの処理をdataMakeメソッドに書いてみましたが、こちらはログに何も表示されず、無反応でした。(一応コメントアウトして残してあります。) ※ヘッダファイルは編集していません。 ■ViewController.m http://www.dotup.org/uploda/www.dotup.org4952372.txt

  • SQLiteによる相関副問い合わせ

    SQLiteによる相関副問い合わせ SQLiteのデータベースについて質問です。 以下のような、商品データベースと、その商品の色に関するデータベースを持っています。 【テーブル head 】 帽子のデータベース name | 値段 | 季節 ------------------------- シルクハットA | 3980 | 春 シルクハットB | 2980 | 夏 キャップA | 1980 | 春 【テーブル color 】 name | color | 配合率 ------------------------- シルクハットA | 赤 | 80 シルクハットA | 白 | 20 シルクハットB | 黄 | 40 シルクハットB | 黒 | 60 キャップA | 青 | 30 キャップA | 黒 | 70 上記のデータベースから黒を含む商品の名前と値段を出力しようと以下の構文を実行しました。 SELECT * FROM head AS H WHERE EXISTS ( SELECT * FROM color WHERE H.name = name AND color = '黒' ) 上記で「Error: near "SELECT": syntax error」になってしまいました。どこが間違っているのでしょうか?

  • ホームセンター等

    ホームセンターの良さと足りない所は何かな? 貴方の考えを教えて下さい お願いします >http://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%BC%E3%83%A0%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC

専門家に質問してみよう