values.put("id", woodno);
values.put("loft", loft_count);
values.put("yards", yard_count);
int colNum=db.update(wood_TABLE,values,null,null);
if (colNum==0) { db.insert(wood_TABLE,"",values); }
Creatは、以下のように行いました。
public DBHelper(Context context) { super
(context,DB_NAME,null,DB_VERSION); }
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exits "+ wood_TABLE+"(id text primary
key, loft double, yards float)");
}
ちなみにQueryは下記のスクリプトですがgetCountがいつも1です。
Cursor c=db.query(wood_TABLE, new String[]
{"id","loft","yards"},null,null,null,null,null);
後、どうすればDBの中身が見えるのでしょうか。DDMSで所在は知っています。
どなたかご教授宜しくお願いします。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
ご指摘ありがとうございます。
修正して再度実行してみます。
On 1月5日, 午前10:31, hiroyuki gohara <hiroyuki.gohara....@gmail.com>
wrote:
> >>db.execSQL("create table if not exits "+ wood_TABLE+"(id text primary
>
> exits -> exist のスペルミスではないでしょうか。
>
> 2010/1/4 Jack <jzl03...@nifty.com>
>
>
>
> > OpenHelperクラスを使用してCreateした後、以下のスクリプトでInsert、Updateをしていますが、どうもKey設定がうまく
> > いっていないのか、何件も書き込んだ後、QueryするとgetCount=1です。
>
> > values.put("id", woodno);
> > values.put("loft", loft_count);
> > values.put("yards", yard_count);
> > int colNum=db.update(wood_TABLE,values,null,null);
> > if (colNum==0) { db.insert(wood_TABLE,"",values); }
>
> > Creatは、以下のように行いました。
> > public DBHelper(Context context) { super
> > (context,DB_NAME,null,DB_VERSION); }
> > @Override
> > public void onCreate(SQLiteDatabase db) {
> > db.execSQL("create table if not exits "+ wood_TABLE+"(id text primary
> > key, loft double, yards float)");
> > }
>
> > ちなみにQueryは下記のスクリプトですがgetCountがいつも1です。
> > Cursor c=db.query(wood_TABLE, new String[]
> > {"id","loft","yards"},null,null,null,null,null);
>
> > 後、どうすればDBの中身が見えるのでしょうか。DDMSで所在は知っています。
>
> > どなたかご教授宜しくお願いします。
>
> > --
>
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
aonoと申します。
回答になっているか分かりませんが,調べてみましたので回答いたします。
なお,昼休みにテストしましたので,誤字脱字や,質問に対する誤解があるかもしれ
ませんがご勘弁願います。
1. プログラムについて
以下の,プログラムとおりであれば,常に最後の1件しか登録されません。
Updateは,条件にマッチしたカラムのレコードを更新するもので,レコードを追加
するものではありません。
以下に,プログラムの流れとあわせて説明します。
values.put("... データの設定
int colNum=db.update(wood_TABLE,values,null,null) レコード更新
最初にレコード更新が行われますが,初期状態ではテーブルが空なので,updateは
行なわれません。よってcolNum = 0でリタンします。
次の行の
if (colNum==0) { db.insert( レコード追加
で,colNumが0なのでinsertを実行し,レコードが追加されます。
以下,上記を繰り返すと,updateで先ほど作成したレコードに対してだけ更新が行
なわれます。Updateはレコードを追加するものではありません。
2. insert
単純にデータを追加するだけなら,updateではなくinsertを使用してください。
そちらのソースを参考にしてサンプルを作成しました。
Insertだけなので,正しく追加されます。
(サンプルと,3.DB閲覧の結果で確認できます)
3. DBの閲覧
Adbにsqlite3コマンドがあります。
これを使用して確認できます。
コマンドの使用方法は,adbのsqlite3を確認してください。
そちらに記載されていたサンプルを修正し,updateをやめてinsertにするプログラ
ムを作成しました。それをsqlite3で確認すると次のとおりとなります。
(データベースファイルは"data",テーブルは"word_table"としました)
# cd /data/data/com.samplesql/databases
# sqlite3 data
sqlite3 data
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> .table
.table
android_metadata word_table
sqlite> select * from word_table;
select * from word_table;
word1|10.0|100.0
word2|11.0|101.0
word3|12.0|102.0
word4|13.0|103.0
word5|14.0|104.0
sqlite>
<サンプル)
package com.samplesql;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
public class SQLTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SQLiteDatabase db = (new DBhelper(this)).getWritableDatabase();
String word = "word";
int wordnum = 1;
int loft_count = 10;
int yard_count = 100;
for(int i = 0; i < 5; i++ ) {
ContentValues value = new ContentValues();
value.put("id", word + Integer.toString(wordnum++));
value.put("loft", loft_count++);
value.put("yards", yard_count++);
// int colNum=db.update("word_table",value,null,null);
// if (colNum==0) {
db.insert("word_table","",value);
// }
}
}
}
-----Original Message-----
From: android-g...@googlegroups.com
[mailto:android-g...@googlegroups.com] On Behalf Of Jack
Sent: Monday, January 04, 2010 10:59 PM
To: 日本Androidの会
Subject: [android-group-japan: 2664] SQLiteがうまく扱えません。教えて下さ
い。
OpenHelperクラスを使用してCreateした後、以下のスクリプトでInsert、Updateをし
後、どうすればDBの中身が見えるのでしょうか。DDMSで所在は知っています。
どなたかご教授宜しくお願いします。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られて
います。
このグループに投稿するには、android-g...@googlegroups.com にメールを
送信してください。
このグループから退会するには、
android-group-j...@googlegroups.com にメールを送信してくださ
い。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja か
らこのグループにアクセスしてください。
丁重な説明ありがとうごzaimasu.
> values.put("... データの設定
> int colNum=db.update(wood_TABLE,values,null,null) レコード更新
> 最初にレコード更新が行われますが,初期状態ではテーブルが空なので,updateは
> 行なわれません。よってcolNum = 0でリタンします。
> 次の行の
> if (colNum==0) { db.insert( レコード追加
> で,colNumが0なのでinsertを実行し,レコードが追加されます。
>
> 以下,上記を繰り返すと,updateで先ほど作成したレコードに対してだけ更新が行
> なわれます。Updateはレコードを追加するものではありません。
最初のInsert時、Tableがない場合、OnhelperクラスのOncreatメソッドが動いて
以下のコマンドを実行することによりTableとキー設定がなされると思っていましたが。
キー指定によるUpdate、指定したキーがない場合のInsertを行なうには、別の方法があるのでしょうか。
public DBHelper(Context context) { super
(context,DB_NAME,null,DB_VERSION); }
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exist "+ wood_TABLE+"(id text primary
key, loft double, yards float)");
}
申し訳ありませんが、ご指導頂ければ幸いです。
Jack
> db.execSQL("create table if not exists "+ wood_TABLE+"(id text primary key, loft double, yards float)");
になっていて、ここに記載する時、転記ミスのようです。
しかし、primary keyを指定し、idが同じならばupdate、新規ならばInsertするというスクリプトのつもりですが、
やはり、何か誤っているか、使用に仕方を間違っているのでしょうか。
ご指導宜しくお願いします。
> > - 引用テキストを表示 -- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
>int colNum=db.update(wood_TABLE,values,null,null);
を
int colNum=db.update(wood_TABLE,values,"id = ?",new String[]{woodno});
とすれば、うまくいくような気がします。
updateの3番目、4番目の引数はSQLでいうwhere句に当たりますので、
これらを指定してあげないと、無条件に全レコードがアップデートされます。
以上、よろしくお願いいたします。
2010年1月5日23:03 Jack <jzl0...@nifty.com>:
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
いろいろ誤解されているようなので,補足しておきます。
SQLiteOpenHelperは,DB操作の前に稼動します。
また,Insert, Updateについても補足しておきます。
1. SQLiteOpenHelperについて
DatabaseHelperはSQLiteOpenHelperから派生して作成しています。
onCreateメソッドは,データベースを生成するときに実行されるメソッドです。
つまり,databasesディレクトリにファイルが存在しない時,実行し,データベー
スを生成します。
2. 「最初のInsert時、Tableがない場合」
SQLiteOpenHelperのonCreateがInsertの前に実行されます。
最初のInsertを実行するときは,すでにonCreateによりテーブルを生成しますの
で,「最初のInsert時、Tableがない場合」とはなりません。
少しくどくなりますが,プログラムは次のように稼働します。
0) データベースがない初期状態
1) onCreateが稼働し,データベースとテーブルを作成する
2) Update, Insertを実行する
となります。
再度,このActivityを起動したときは,1)は実行されず,2)のUpdateだけを実行し
ます。
3. InsertとUpdate
SQLのInsertはデータベースに新規追加します。つまり,今まで存在していないレ
コードを追加します。(実行後にレコード数は増加する)
一方,Updateは既存レコードの更新を行います。(実行後に,レコード数は変わら
ない)
Jack様が提示されたプログラムでは,Updateが成功すると,Insertは実行されませ
ん。KAGO様がご指摘のように,提示されたプログラムでは,"where"がないので,全
レコード(この場合は1レコードだけ)書き換えとなります。
3. キー指定
Primary keyを使用する場合,指定されたキーはユニークでなければなりません。
これには,ユーザが責任を持ってほかと重ならない設定を行うか,データベースに
任せる方法があります。
ここでは,後者だけ説明します。
Create tableで,id指定を,"id integer primary key autoincrement"と定義する
ことで,Insert実行時に,id番号が重ならないよう,自動的に割り振られます。
補足: 提示されたプログラムでは,必ず「指定されたキーが存在しないInsertを行な
う必要があります」
Updateするときには,存在するidを指定します。(primary keyなので,狙い撃ちす
る),指定方法はKAGO様のメールを参考にしてください。
aono様
丁重な説明ありがとうごzaimasu.
}
申し訳ありませんが、ご指導頂ければ幸いです。
Jack
ご指導ありがとうございます。
どうすればキー指定出来るのかと悩んでいました。
QueryやInsertも同様の指定があると思いますので探してみます。
OracleなどのSQLを自前で発行するのは簡単ですが、Android関数を使用するとなると
中々、英文では引数の意味がわからず苦労しています。
Android関数の日本語版て出版されないのでしょうかね。
On 1月6日, 午前8:10, KUGO <kugotats...@gmail.com> wrote:
> はじめまして。
> KUGOと申します。
>
> >int colNum=db.update(wood_TABLE,values,null,null);
>
> を
> int colNum=db.update(wood_TABLE,values,"id = ?",new String[]{woodno});
> とすれば、うまくいくような気がします。
>
> updateの3番目、4番目の引数はSQLでいうwhere句に当たりますので、
> これらを指定してあげないと、無条件に全レコードがアップデートされます。
>
> 以上、よろしくお願いいたします。
>
> 2010年1月5日23:03 Jack <jzl03...@nifty.com>:
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
うまくいきました。
大変ありがとうございました。
これからも宜しくお願いします。
> ...
>
> もっと読む ≫- 引用テキストを表示しない -
>
> - 引用テキストを表示 -