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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

396閲覧

todoリストでSQLで、アップデートするとリストが全て、同じ項目の繰り返しになります。

edoooooo

総合スコア476

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/04/17 11:58

編集2017/04/19 14:27

AndroidでTodoリストを作ったのですが、
todoリストで一つのListが繰り返し表示されます
新規登録でlistを追加した場合も、編集でリストをupdateした場合も、
Listが一つのList(同じ情報のもの)のみの繰り返しとなります。

この下のコードは、メモをデータベース(SQLite)から取得し、mapに値を入れて、それを、ListViewで表示しているコードです。

//MainActivity

java

1public class MainActivity extends AppCompatActivity { 2 // ListView 用アダプタ 3 SimpleAdapter mAdapter = null; 4 5 6 // ListView に設定するデーた 7 List<Map<String, String>> mList = null; 8 /////////////////////////////////////////////////////ここに宣言されているmListが原因? 9 10 //新しく追加ListView 11 ListView list=null; 12 13 //質問する前につ以下 14 SQLiteDatabase db=null; 15 16 17 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 25 MemoDBHelper memoDBHelper=new MemoDBHelper(this); 26 db=memoDBHelper.getWritableDatabase(); 27 28 29////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ここCREATE_TABLE 30 //db.execSQL(CREATE_TABLE); 31 32 33 34 ListView list = (ListView) findViewById(R.id.listView); 35 mList = new ArrayList<Map<String, String>>(); 36 37 38 mAdapter = new SimpleAdapter(this, 39 mList, 40 //独自で定義したlayoutを適応する 41 android.R.layout.simple_list_item_2, 42 new String[]{"title", "content", "data"}, //Map側のkey 43 new int[]{android.R.id.text1, android.R.id.text2, R.id.eTxtData} //layout側のTextViewId 表示させたいMapのkey順に合わせる 44 ); 45 46 // ListView にアダプターをセット 47 list.setAdapter(mAdapter); 48 49 50 ///////////////////////////////////////////////この上でリストを表示してる、データベースにデータがあるから、表示がまちがえ? 51 52 53 // ListView のアイテム選択イベント 54 list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 55 56 @Override 57 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 58 59 60 // 編集画面に渡すデータをセットし、表示 61 Intent intent = new Intent(MainActivity.this, EditActivity.class); 62 63 // //これは編集だから から文字にする 64 intent.putExtra("INSERT",""); 65 66 intent.putExtra("TITLE", mList.get(pos).get("title")); 67 intent.putExtra("CONTENT", mList.get(pos).get("content")); 68 intent.putExtra("DATA", mList.get(pos).get("data")); 69 70 71 String title1= mList.get(pos).get("title"); 72 String content1=mList.get(pos).get("content"); 73 String data1=mList.get(pos).get("data"); 74 String data2=data1.toString(); 75 76 String table2=UserContract.Users.TABLE_NAME; 77 //////////////////なぜかCOL_TITLEとかでなくTITLEで取得できる???????????? 78 79 String sql="SELECT * FROM " +table2 + 80 " WHERE TITLE = " +"'"+title1 +"'" + 81 " AND CONTENT ="+ "'"+content1 +"'"+ 82 " AND DATA =" +"'"+data2 +"'"; 83 84 //下のnullは条件の?の奴 85 Cursor c =db.rawQuery(sql,null); 86 87 88 if(c.moveToFirst()) { 89 String idd = c.getString(c.getColumnIndex(UserContract.Users._ID)); 90 91 //表示できてる 92 93 c.close(); 94 intent.putExtra("ID", idd); 95 //ここで IDにせっとし intentを飛ばしてる 96 } 97 98 startActivity(intent); 99 } 100 }); 101 102 // ListView をコンテキストメニューに登録 103 registerForContextMenu(list); 104 } 105 106 107 108 109 110 @Override 111 protected void onResume() { 112 super.onResume(); 113 114 //open helper 115 //open db memoDBHelperに変更 116 MemoDBHelper memoDBHelper=new MemoDBHelper(this); 117 SQLiteDatabase db=memoDBHelper.getWritableDatabase(); 118 119 120 // ListView 用アダプタのデータをクリア 121 mList.clear(); 122 /////////////////////////////////////////////////////////このclearがいけないのか? 123 124 125 String id=null; 126 String title = null; 127 String content = null; 128 String data=null; 129 130 131 String table2=UserContract.Users.TABLE_NAME; 132 String sql="SELECT * FROM " +table2 ; 133 134 135 136 137 //下のnullは条件の?の奴 138 Cursor c =db.rawQuery(sql,null); 139 140 Log.v("DB_TEST","Count:"+c.getCount()); 141 142 Map<String, String> map = new HashMap<String, String>(); 143 while(c.moveToNext()){ 144 145 //この下のこんな書き方にする必要ある? 146 //だからupdateされ無いんじゃん?わからん 147 title=c.getString(c.getColumnIndex(UserContract.Users.COL_TITLE)); 148 content=c.getString(c.getColumnIndex(UserContract.Users.COL_CONTENT)); 149 data=c.getString(c.getColumnIndex(UserContract.Users.COL_DATA)); 150 151 152 //このLog.vはデータベースからselectした情報をc.moveToNext()してる奴だから有効 153 //つまりデータベースにはしっかり入力できてるってこと 154 Log.v("DB_TESTここはMainActivity"," id: "+id+ "title: "+title+ " content: "+content+ " data: "+data); 155 //////////////////////////このログを見るといろいろ取得できてるなのに表示は同じもの 156 157 map.put("title", title); 158 map.put("content", content); 159 map.put("data",data); 160 mList.add(map); 161 162 //////////////////////////リストの表示が悪い?それかこの上のコード map.putのやつ 163 164 } 165 166 //ここで、addされたmListをlistViewに表示することをやるためにonCreateのん作業をメソッドで呼ぶ必要? 167 168 c.close(); 169 db.close(); 170 171 // ListView のデータ変更を表示に反映 172 mAdapter.notifyDataSetChanged(); 173 } 174 175 176

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

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

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

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

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

akabee

2017/04/17 13:10

「リストに追加」をするとどのメソッドが動くのですか。バグ探しをしてほしいのであれば、最低限問題の動作をするメソッドとそこから呼び出される全てのメソッドは記載してほしいです。
edoooooo

2017/04/17 13:48

リストに追加は、保存ボタンで行い、ボタンを押すと、onOptionsItemSelected(MenuItem item)が呼ばれます。コードを追加しました。どうぞ宜しくお願い致します。
akabee

2017/04/17 14:11

switch文の終わりが見えないように思いますが・・。これで問題個所としては十分な情報があるということですか。
edoooooo

2017/04/17 14:18

}が一つ不足していました。申し訳ありません。修正しました。
guest

回答2

0

yonaさんの回答でいわれているように、デバッグの仕方をまずは学ぶべきではないでしょうか。

「if文で、全てが、insertでなくupdateになってしまっているとも考えられ・・・」とコメントされていることから察するに、実際にinsertとupdateのどちらが行われているのかもご自身で掴めていないのでは?
「insertのつもりがupdateしてるのかも」と予測ができているのですから、その次に行うべきは検証です。
特に今回のケースでは「保存に成功しました」と出しているであろう2箇所を異なるメッセージにするだけで
ボタンを押したときinsertの処理が行われているのか、updateの処理が行われているのかがわかるはずです。

※ ところでif文の条件にあるinsertkはどこから出てきたのでしょうか?

投稿2017/04/17 15:33

fcrow

総合スコア96

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

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

edoooooo

2017/04/17 17:57

insertかupdateかは、Logを出力し、試した所、問題なくinserkの値がセットされ、しっかり分岐できていました。 insertkを定義しているコードがtarataillに乗せる際に抜け落ちていました。申し訳ありません。記載しました。
guest

0

ベストアンサー

まず、自分でデバッグをしましょう。
入力データが正しいか、出力データが正しいかなど、各タイミングでデータを確認してください。

投稿2017/04/17 12:36

yona

総合スコア18155

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

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

edoooooo

2017/04/17 12:40

回答ありがとうございます。 if文で、全てが、insertでなくupdateになってしまっているとも考えられ、 updateに問題があるのでは、考えています。 書くタイミングでの確認を行います。
yona

2017/04/17 12:43

突然if文と言われてもわかりません。 回答者は質問に記載されている内容しか知らないということを理解してください。
edoooooo

2017/04/17 12:44

申し訳ありません。コードを記載します。
yona

2017/04/17 15:59

コードがとにかく汚いです、メソッドを分けてください。 また、updateを3回に分けてやる意味はなんですか? 他にもExceptionでcatchするなんてエラーを探す気はないのでしょうか。 コメントが意味をなしていません。
edoooooo

2017/04/17 18:02

ありがとうございます。 updateについては、まとめて実行するやり方を探してみます。 エラーをキャッチするには、どのような指定をすれば良いのかも調べてみます。 メソッドを分けるとは、編集画面のEditActivityで、一連の動作として、日時を取得しtextにsetするといったことをメソッドを呼び出すことでコードをスッキリさせるということでよろしいでしょうか?
yona

2017/04/18 01:25

メソッドの役割を1つになるまで分割し、メソッドの役割を100文字程で簡潔に説明できるくらいにしてください。
edoooooo

2017/04/18 01:59

わかりました。わかりやすいコードを、メソッドの役割に着目し、書くようにします。 ありがとうございました。
yona

2017/04/18 02:19

それはそれとして デバッグしてみた結果はどうですか。 updateで全件が上書きされているような挙動ですが。
edoooooo

2017/04/18 04:33

updateで、同じ数値を上書きしている理由として、複雑なupdate文と考えたため、自動連番のIDを取得し、updateするようにupdate文を変更しました。
yona

2017/04/18 04:38

なにを説明しているのかわかりません。 updateの条件はtitleカラムが一致するとなっています。
edoooooo

2017/04/18 05:07

申し訳ありませんでした。updateの条件のカラムをidにしたコードに変更しました。 MainActivity EditActivity共に最新のものと変更しました。 どうぞ宜しくお願い致します。
yona

2017/04/18 05:25

iddの値と_IDの値を出力してください。 _IDは数字なんですよね? 例えば、iddが1、_IDが1の場合に1=1になるので全件アップデートになると思います。
edoooooo

2017/04/18 06:02

ありがとうございます。 UPDATE UserContract.Users.TABLE_NAME SET COL_DATA=data WHERE iUserContract.Users._ID=idd このような形で考えてみたところ、_IDが1の場合にiddが1のものだけがアップデートになるのでは無いのでしょうか?
edoooooo

2017/04/18 06:07

わかりました。申し訳ありませんでした。
edoooooo

2017/04/19 16:44

while(c.moveToNext()){ Map<String, String> map = new HashMap<String, String>(); のように、while文の中にmapの定義を移動することでこちらも解決しました。 この問題の解決に至るまでにupdate文の改善や、select文の改善、そして、Logの出力や、intentにデータ(id)をもたせて、intentの移動先で、updateの際のwhere文の条件にidを使うなどといった様々な問題を挟んでの解決となりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問