DBテーブル追加に関して

358 views
Skip to first unread message

花田

unread,
May 18, 2011, 9:24:29 PM5/18/11
to 日本Androidの会
いつもお世話になります。

花田と申します。

DBのテーブル追加に関してご質問があります。
アプリ初期起動時、DBがなければonCreate()メソッドが走り、DBの作成を行うと思います。
onCreateメソッド内にテーブル作成のqueryを実装しているのですが、
一度、DB作成したら、onCreate内にテーブル追加しても作成されないのでしょうか。

例えば、
onCreate内にAテーブル作成の実装をし初回デバッグを行います。
この段階でDBが作られAテーブルも一緒に作成されます。
   ↓
二度目、onCreate内にBテーブル追加の実装を行い、
デバッグ。 DBファイルを見たら、Aテーブルのみ表示されていて、Bテーブルは表示されていない。

といった具合です。

DBが存在するため、二度目からはonCreateが走らないということなのでしょうが、
試しに、DBファイルを削除して再度走らせてみたのですが、初回デバッグ時のDBファイルが繁栄されているのです。

あとから、テーブルを追加したい場合はのヒントを頂けますでしょうか。

説明べたで大変申し訳ありません。

宜しくお願い致します。

花田
Message has been deleted

花田智憲

unread,
May 18, 2011, 9:47:58 PM5/18/11
to android-g...@googlegroups.com
大垣さん

いつもいつも有難うございます。

自分の技術力のなさが情けなく感じてしまいます。

>SQL文の間違いか、トランザクションがコミットできていないとか(経験)
この辺をさらに調査してみます。

まだまだ、調査力がないと思いました。

結果が出たら、ご報告します。

有難うございます。

花田


2011年5月19日10:40 大垣憲俊 <noritos...@gmail.com>:
花田さん

首が抜けない、大垣です。

> 一度、DB作成したら、onCreate内にテーブル追加しても作成されないのでしょうか。 

常識的に考えると、同じ方法でテーブルを作成すれば、追加できないはずはない(仮定)
しかし、追加できないとすれば、誤解か、仕様か、調査の仕方に問題がある(仮定)
もしかしてテーブルの「レコードの」キー値が重複しているという意味かも(推測)
しかし、レコードではなくテーブルだという認識は合っていると善意に解釈したい(希望)
SQL文の間違いか、トランザクションがコミットできていないとか(経験)
報告された事実が少なくて、判断できない(結論)
もっと、事実を積み上げて報告してね(お願い)

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

Penguin Android

unread,
May 19, 2011, 12:14:26 AM5/19/11
to android-g...@googlegroups.com
andropenguinと言います。

今日は。
テーブル追加で、ヘマをやって、アプリが強制終了して、マーケットで
酷評を書かれたことがあります。

2011年5月19日10:24 花田 <hanad...@gmail.com>:

テーブル追加の場合、アプリがインストール済みで、新しいバージョンのアプリを
インストールしても、アプリ起動時にSQLiteOpenHelperのonCreateは呼ばれないようです。
データベースのバージョンを上げて、onUpgradeメソッドに、バージョンの値が
新しい値の場合、テーブルを作成するexecSQLを呼ぶ処理を書く必要があります。
書式は、「Android SDK開発のレシピ」とかが参考になります。

noritoshi ogaki

unread,
May 19, 2011, 12:24:46 AM5/19/11
to android-g...@googlegroups.com
アンドロペンギンさん、花田さん

大垣です。リファレンスに書いてありました。

You create a subclass implementing onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.
This class makes it easy for ContentProvider implementations to defer opening and upgrading the database until first use, to avoid blocking application startup with long-running database upgrades.
For an example, see the NotePadProvider class in the NotePad sample application, in the samples/ directory of the SDK.

まあ、ようするにサンプルを見ろと、いうことで、以下引用。
onUpgrade なわけですね、花田さん。


private static class DatabaseHelper extends SQLiteOpenHelper {

       DatabaseHelper(Context context) {
           super(context, DATABASE_NAME, null, DATABASE_VERSION);
       }

       @Override
       public void onCreate(SQLiteDatabase db) {
           db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME + " ("
                   + Notes._ID + " INTEGER PRIMARY KEY,"
                   + Notes.TITLE + " TEXT,"
                   + Notes.NOTE + " TEXT,"
                   + Notes.CREATED_DATE + " INTEGER,"
                   + Notes.MODIFIED_DATE + " INTEGER"
                   + ");");
       }

       @Override
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
           Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                   + newVersion + ", which will destroy all old data");
           db.execSQL("DROP TABLE IF EXISTS notes");
           onCreate(db);
       }
   }

花田智憲

unread,
May 19, 2011, 4:28:50 AM5/19/11
to android-g...@googlegroups.com
大垣さん
andropenguinさん

花田です
有難うございます。

無事onUpgradeを走らせることができました。

Logにsyntaxエラーが出ていますが・・・
”create table ××××× _id integer primary key autoincrement not null”


追加したい場合などはonUpgradeを利用することがよくわかりました。

引き続き頑張ります!

有難うございます。

花田



2011年5月19日13:24 noritoshi ogaki <noritos...@gmail.com>:

yasu naka

unread,
May 18, 2011, 9:50:24 PM5/18/11
to android-g...@googlegroups.com
花田 様

テーブル構成が変更されるというこは、アプリのアップグレードとして追加してはいかがでしょうか?

SQLiteOpenHelperのpublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)をオーバーライドし、
データベースのバージョン情報を更新(oldVersionが1 -> newVersionが2など)をonUpgrade内で判定し、
必要ならテーブル、カラムの追加などを行う。

それか、デバッグ中であればアプリをアンインストールしてから再度インストールしてみるとか。
(Android上のデータベースファイルを無理やり消すよりはアンインストールで消したほうがいいかも)

ご参考までに。


花田智憲

unread,
May 19, 2011, 6:01:42 AM5/19/11
to android-g...@googlegroups.com
お疲れ様です、花田です。

ご回答して頂いた皆様有難うございます。

うまくテーブル作成が出来ました。
テーブル追加も無事完了しました。

一つ不思議なことがあります。
テーブルを作成する際、

create table GROUP ~~~
と、テーブル名を大文字にするとsyntaxエラーが起こります。
しかし
create table group_tbl ~~~
に修正して行うと正常に処理されます。

なぜこのような現象が起きるのかわかる方いらっしゃいましたらお願いいたします。

花田



2011年5月19日10:50 yasu naka <beyn...@gmail.com>:

Hiroyuki Ito

unread,
May 19, 2011, 8:59:30 AM5/19/11
to android-g...@googlegroups.com
To:花田さま

お疲れさまです。
伊藤@茅ヶ崎 です。

すみません。
以下の件について1点確認させてください。

> create table GROUP ~~~
> と、テーブル名を大文字にするとsyntaxエラーが起こります。
> しかし
> create table group_tbl ~~~
> に修正して行うと正常に処理されます。
> なぜこのような現象が起きるのかわかる方いらっしゃいましたらお願いいたします。


これは、「GROUP」というテーブルを作成しようとしたもので
認識はあってますでしょうか?

というのも、
上段のSQLの「GROUP」は「group by」(集約関数)として解釈されているために
「テーブル名がくるところに集約句がきてるよ」ということで
syntaxエラーになっていると思ったからです。

このSQLであれば、「GROUP」の大文字・小文字に関係なく、
SQL文法のエラーになると思います。

一方、下段のSQLであれば、「group_tbl」というテーブル名で処理されますので
問題なく処理されます。


あげあしとりな確認で申し訳ありませんが、
よろしくお願い致します。


2011年5月19日19:01 花田智憲 <hanad...@gmail.com>:

花田智憲

unread,
May 19, 2011, 9:10:14 AM5/19/11
to android-g...@googlegroups.com
伊藤@茅ヶ崎 さん

花田です。

GROUPというテーブルを作成しようと思っていました。

なるほど!
伊藤@茅ヶ崎 さんのいう「group by」として解釈されていたためというのは、まったく気づきませんでした!!

試しに、「ORDER」でやってみると、そこの箇所で落ちました。
「order by」と認識したのだと思います。

良い教訓になりました。
大変有難うございます。

花田




2011年5月19日21:59 Hiroyuki Ito <shona...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages