質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

FMDB

FMDBは、SQLiteをObjective-Cから扱いやすくするためのラッパーライブラリです。GitHubで公開されており、SQLite暗号化ライブラリのSQLCipherにも対応。Swiftの利用も可能です。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

2回答

2797閲覧

DB Error: 1 "no such column:

app

総合スコア8

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

FMDB

FMDBは、SQLiteをObjective-Cから扱いやすくするためのラッパーライブラリです。GitHubで公開されており、SQLite暗号化ライブラリのSQLCipherにも対応。Swiftの利用も可能です。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/02/17 11:32

編集2016/02/17 13:15

iOSアプリの開発をしております。

FMDBを用い、sqliteをDBとしています。

シミュレータでは正常に動作しますが、
実機で動作させようとすると、以下のエラーが出ます。

『DB Error: 1 "no such column: activeSecond"』
『DB Query: UPDATE active SET activeSecond = :ACTSEC WHERE id = 0;』
『DB Path: /var/mobile/containers/Data/Application/[ユニークな文字列]/Documents/[DB名]

直前のselect文はできているのですが、update文が入るとNGのようです。

前述の通り、シミュレータでは動作するので、コードには問題ないと考えております。

何か設定に誤りやおかしい個所があるのかと推測しておりますが、どこがおかしいのか皆目見当が付きません。

どなたか、原因について心当たりのある方、ご教授頂ければと存じます…。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

一度、シミュレータ内のdbを削除(=アプリを削除)してから再度実行しても正常動作するでしょうか?
古いカラムが残っているために正常動作しているのかも知れません。
これが原因ならdbの生成に問題があるということになります。

投稿2016/02/18 00:25

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

app

2016/02/18 00:31

回答ありがとうございます。 実機でのデバック時には古いアプリを必ず消去してから行っております。 削除の方法はアナログですがアイコン長押しで×クリックです。
fuzzball

2016/02/18 01:24

実機じゃなくてシミュレータでの話なのですが、シミュレータでも削除してから実行しているのでしょうか?
app

2016/02/18 02:31

申し訳ありません。『実機でもシミュレータでも』の誤りです。
fuzzball

2016/02/18 04:59 編集

同等の環境を作ってテストしてみましたが、実機でも正常にupdate出来ました。 また、カラム名を変えてみると同じエラーメッセーが出ました。 DB Error: 1 "no such column: hogehoge" DB Query: UPDATE active SET hogehoge = :ACTSEC WHERE id = 0; 追加で質問です。 ・テーブル名は"active"で正しいでしょうか? ・うまくいっているselect文のsqlを教えて下さい。 ・初回起動時のテーブルの生成方法を教えて下さい。 「シミュレータでは正常動作する」ことにこだわらず、原因を探した方が良いと思います。
guest

0

『DB Error: 1 "no such column: [カラム名]』
『DB Query: [UPDATE文]』

と出ているんだからUPDATE文がなにかおかしいんだろうと思います。
そのメッセージに表示されているUPDATE文の内容を隠して質問されてもこれ以上はわかりません。

たいてい、UPDATE文に指定している文字列をシングルクオートで囲んでないか、
シングルクオートの対応が狂っている時にこのエラーが出るケースが多いと思います。
(参考)
http://notebook-t-0731.hatenablog.com/entry/2013/05/23/173308

投稿2016/02/17 12:55

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

app

2016/02/17 13:10

回答ありがとうございます! シミュレータ上ではエラーは出ないので、UPDETE文には問題ないと思いますが、念のため、UPDATE文も記述します。
TakeOne

2016/02/17 15:09 編集

UPDATE文を見ると、activeSecondに「:ACTSEC」という値を入れようとしていますが、 文字列を格納するフィールドなら、最初の回答で指摘した通りシングルクオートで囲んで 「activeSecond = ':ACTSEC'」と指定する必要があると思います。 もしactiveSecondが数値(秒数?)を格納するつもりのフィールドなら、 「activeSecond = 10」のように数値を指定するはずだと思います。 シミュレータならエラーは出ないとのことですが、シミュレータで動作させた場合も同じようにUPDATE文に「activeSecond = :ACTSEC」と指定したものがエラーなく動作しているんですか? 私の環境ではこんなUPDATE文はシミュレータでも実機でもエラーになりますけど。 シミュレータ動作時と実機動作時で、実行しようとしているUPDATE文に違いがないか、 きちんとログをとって確認してみることをお勧めします。
izkn

2016/02/17 19:59

横槍失礼。:ACTSEC はバインド変数だと考えます。
TakeOne

2016/02/18 00:04

izknさん、ご指摘ありがとうございます。 勉強不足でした。"?"を使ってバインディングする方法しか知らず、エラーのUPDATE文に"?"がなかったので文字列でUPDATE文を組み立てたのだろうと思ってしまいました。 executeUpdate:withParameterDictionaryでNSDictionaryを指定して、「:キー名」でそのキー値をバインドさせることができるんですね。大変勉強になりました。 いずれにしても、シミュレータ動作時と実機動作時で、実行しようとしているUPDATE文および指定NSDictionaryに違いがないか確認が必要だと思います。
app

2016/02/18 00:38

izkn様 フォローありがとうございます。 TakeOne様 シミュレータも実機も同様のUPDATE文を実行しておりますし、指定しているキー名も違いはありません…。 因みにですが、コードは一つなのにシミュレータと実機で実行されるコードが違う場合があるということでしょうか?
TakeOne

2016/02/18 02:31 編集

> コードは一つなのにシミュレータと実機で実行されるコードが違う場合があるということでしょうか? UPDATE文を実行するのにNSDictionaryを作成してそれを指定しているのですよね? そのNSDictionaryの作成を誤って、別の環境だとうまく動作しないコードになっている可能性はないんですか? コードを示さずに質問されているので、これくらいしかコメントできません。 勝手にこちらでコードを推測して回答してもまた混乱させるかもしれませんので。 何度も指摘している通り、まずはシミュレータ動作時と実機動作時で、実行しようとしているUPDATE文および指定NSDictionaryの内容に違いがないかNSLog等で情報出力して確認すべきだと思います。 もしその内容に違いがないことが確認できたら、別回答でfuzzballさんが指摘されているように、シミュレータのデータペース内容は(以前に作成したことのある)activeSecondというフィールドが残っていて動作するけど、実機のデータベースを新規作成した時にactiveSecondというフィールドが作成されていなくてエラーが発生しているという可能性が高いと思います。
app

2016/02/18 02:46

申し訳ありません。 コードを初めに書かなかったのは、コードレビューが目的ではなく、同様の症状がありXCODEで何か設定するものがあるか心当たりのある方を求めていた為です。 以下コードとなります。 //DB PATH func setPath()->(String){ let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true) let _path = paths[0].stringByAppendingPathComponent(dbName) return _path } //エラーの発生箇所 変数『activeSec』には起動直後なので『0』が代入されてます。 let sql = "UPDATE active SET activeSecond = :ACTSEC WHERE id = 0;" let db = FMDatabase(path: setPath()) db.open() db.executeUpdate(sql, withParameterDictionary: ["ACTSEC":activeSec]) db.close()
TakeOne

2016/02/18 05:26

コードを見させていただいたところ、作成しているUPDATE文は固定的なものなので、確かに環境によって変わる可能性は低いと思います。 開示されたコードをコピペして、テーブル作成(id INTEGER, activeSecond INTEGER)とactiveSec変数(Int型)の定義を追加して実行したら、私の環境では実機でもシミュレータでも正常に実行できました。 しかし、実機で『DB Error: 1 "no such column: activeSecond"』というエラーが出ているとなると、やはり更新しようとしているテーブル構成が違う(実機にはactiveSecondフィールドが存在しない)可能性が高いのではないかと思います。なので、テーブル作成処理も見直した方がよさそうに思います。 また、 http://sqlitebrowser.org のようなデータベース参照ツールを使って、実機に格納されているデータベースファイルを取り出して内容を確認してみた方がよさそうに思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問