- ベストアンサー
XcodeでSQLiteファイルを開けない
- iPhoneプログラミング開発でカレンダーの予定データなどを管理するためにデータベースを使ったアプリを使いたく、SQLiteの勉強をしているのですが、エラーが出てうまく処理できません。
- 参考にしたページでコードの追加やライブラリの追加に問題はないと思いますが、実行すると「error opening! :14」というエラーが表示され、データベースが正しく作成されていないようです。
- 以下にコードを添付しますが、どこが間違っているか教えていただけると助かります。
- みんなの回答 (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メソッドでエラーメッセージが出たと言えばすぐわかる話です。
その他の回答 (1)
- Lchan0211b
- ベストアンサー率61% (573/930)
> 「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ずつ実行して 変数の状況を確認すれば、何が悪いかわかると思います。
補足
回答ありがとうございます! 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を使っています。 コードを実行できるとは言わないのですね^^; デバッグ出来るというのが正しい言い方ですかね? プログラミング用語は難しいです… オブジェクトだとかインスタンスだとか・・・あいまいな認識のままでやっています
お礼
早い回答ありがとうございます! 説明不足すみません。 storyBoardを使っていることを書き忘れていました。 >(makeDataボタンを押したらどんな処理が動作するのか 今回の補足でも明確には書かれていませんが、 makeDataメソッドが呼ばれるようになっているのですよね?) そのとおりです。 同様にopenDataボタンもあり、ボタンを押すとopenDataメソッドが実行され、InsertしたデータベースをLogに表示するようになっています。 最初プロパティ宣言した変数でパスを保持して、それを使いまわす方法でやってみましたが、それだとFMDBフォルダ内に追加したソースコード上でアクセスエラーが出てしまったので、db_pathを求める処理3行をメソッド化した処理を組んだところ、上手くいき InsertしたデータをNSLogできちんと表示することができました! あと、iPhone simulatorフォルダが見つからなかったのですが、OSがLionだとデフォルトでは表示されていない?ようで、隠しフォルダのようになっているとのことでした。 それを表示したところ、iPhone simulator以下を辿ってtests.dbまでたどり着けました。 (確認できたのが、コードを適切に書き直した後だったので、質問した時点でデータベースが作成されていたのかは不明です・・・)