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

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

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

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

Java

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

Android

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

Android Studio

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

Q&A

解決済

2回答

2405閲覧

todoリストアプリで、同じListが繰り返される。mList.clearをコメントアウトすると、改善するが、SQLのupdateしても表示がされなくなる。

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/19 14:30

編集2017/04/19 16:03

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

mList.clearというコードが書いてあるのですが、表示されるListは、全部同じもので繰り返し表示されています。そして、リスト編集ボタンをおし、updateしようとすると、updateされます。
一方、mList.clearをコメントアウトすると、表示されるListは、複数の種類のListが表示されますが、リスト編集ボタンを押して、updateしようとしても、updateは、されません。

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

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

//EditActivity updateのコードを追加しました。

java

1// メニュー選択時の処理 2@Override 3public boolean onOptionsItemSelected(MenuItem item) { 4 5 //open helper 6 //open db memoDBHelperに変更 7 MemoDBHelper memoDBHelper = new MemoDBHelper(this); 8 SQLiteDatabase db = memoDBHelper.getWritableDatabase(); 9 10 11 Cursor c = null; 12 String title = null; 13 String content = null; 14 String data = null; 15 EditText eTxtTitle = null; 16 EditText eTxtContent = null; 17 EditText eTxtData = null; 18 19 //ここのidにcancelとupdateを入れる 20 switch (item.getItemId()) { 21 case R.id.action_can: 22 //キャンセルが押された場合 23 mNotSave = true; 24 this.finish(); 25 break; 26 27 case R.id.action_upd: 28 // タイトル、内容、実行日の追加 29 eTxtTitle = (EditText) findViewById(R.id.eTxtTitle); 30 eTxtContent = (EditText) findViewById(R.id.eTxtContent); 31 eTxtData = (EditText) findViewById(R.id.eTxtData); 32 33 title = eTxtTitle.getText().toString(); 34 content = eTxtContent.getText().toString(); 35 data = eTxtData.getText().toString(); 36 37 //if文で、たいとるがからの時は、保存しない 38 // タイトル、内容が空白の場合、保存しない 39 40 Intent intent = getIntent(); 41 //あえてinsertkに変更 42 String insertk = intent.getStringExtra("INSERT"); 43 44 //////////////////////////////////////////iddを取得してる 45 String idd=intent.getStringExtra("ID"); 46 47 48 if (title.isEmpty() || content.isEmpty()) { 49 Toast.makeText(this, R.string.msg_destruction, Toast.LENGTH_SHORT).show(); 50 51 } 52 53 if (insertk.length() == 0) { 54 55 //つまりinsertじゃない つまりupdate 56 try { 57 //書き換えをしていく 58 59 //MainActivityと同じ 60 String table2=UserContract.Users.TABLE_NAME; 61 62 63 64 String sql="UPDATE "+table2+ 65 " SET TITLE = "+"'"+title+"',"+ 66 " CONTENT = "+"'"+content+"',"+ 67 " DATA = "+"'"+data+"' "+ 68 "WHERE ID = "+"'"+idd+"'" ; 69 70 Cursor cc = db.rawQuery(sql,null); 71 72 if(cc.moveToFirst()) { 73 title = cc.getString(cc.getColumnIndex(UserContract.Users.COL_TITLE)); 74 content = cc.getString(cc.getColumnIndex(UserContract.Users.COL_CONTENT)); 75 data = cc.getString(cc.getColumnIndex(UserContract.Users.COL_DATA)); 76 Log.v("DB_TESTやーーーーーーーーーー"," id: "+idd+ " title: "+title+ " content: "+content+ " data: "+data); 77 78 79 } 80 81 Log.v("DB_TESTやーーーーーーーーんupdate"," id: "+idd+ " title: "+title+ " content: "+content+ " data: "+data); 82 //取得できてる、ちゃんと 83 84 85 //保存に成功しました。 86 Toast.makeText(this, R.string.msg_upd, Toast.LENGTH_SHORT).show(); 87 88 } catch (Exception e) { 89 //さっきのここ 90 System.out.println("Exception ErrorMessage = " 91 + e ); 92 Toast.makeText(this, "強制returnしましたよ。", Toast.LENGTH_LONG).show(); 93 } 94

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

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

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

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

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

swordone

2017/04/19 15:59

質問文を自分でもう一度読み返してください。日本語が不自由過ぎて何言ってるかわかりません。
edoooooo

2017/04/19 16:25 編集

コード編集→リスト編集 、 新規登録→リストの追加 といった具合に変更し、その他の文を改善しました。申し訳ありませんでした。
swordone

2017/04/19 16:18

日本語勉強してから出直してきてください
edoooooo

2017/04/19 16:24

まだ読みづらい文章でしたでしょうか。申し訳ありません。修正します。
guest

回答2

0

ベストアンサー

すべての元凶は、

java

1Map<String, String> map = new HashMap<String, String>();

の宣言をwhile文の前で行っていることです。
そのために、while文内で行っているputがすべて同じインスタンスに対して行われています。
mlistにaddしていったMap要素はすべて同じインスタンスを参照するため、
表示されるのは最後にputした、つまりデータベースから最後に取り出した要素のみが並ぶことになります。

これがわからない場合は、Javaにおける参照を勉強しなおしてください。

投稿2017/04/19 16:24

swordone

総合スコア20653

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

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

edoooooo

2017/04/19 16:37 編集

ありがとうございます。 while(c.moveToNext()){ Map<String, String> map = new HashMap<String, String>(); とすることで、todoリストアプリが改善しました。 おっしゃられていた意味もわかりました。ありがとうございました。
guest

0

onResumeはActivityが再開されるたびに
呼ばれます。その都度、ArrayListに同じデータを追加すると同じリストが表示されるのは当たり前です。だからclearをする必要があります。
単純にupdateできていないだけじゃないですか?updateができているかを確認してください。

あと、メソッドを分けましょうというアドバイスが活かされていないですね。
この調子でやるなら多分何年経っても完成はしないでしょうね。

投稿2017/04/19 15:42

yona

総合スコア18155

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

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

edoooooo

2017/04/19 16:21 編集

V/DB_TESTここはMainActivity: id: 1title: ゆまや content: ゆねは data: 4月19日 V/DB_TESTここはMainActivity: id: 2 title: よ content: ならひ data: 4月19日 V/DB_TESTここはMainActivity: id: 3 title: なかのはた content: やなか data: 4月19日 V/DB_TESTここはMainActivity: id: 4 title: ついかあ content: あなか data: 4月19日 V/DB_TESTここはMainActivity: id: 5 title: たゆた content: ゆ data: 4月19日 V/DB_TESTここはMainActivity: id: 6 title: ゆは content: やーら data: 4月19日 V/DB_TESTここはMainActivity: id: 7title: あかあたか content: たあ data: 4月19日 V/DB_TESTやーーーーーーーーんupdate: id: 7 title: あかあたかゆのや content: たあ data: 4月19日 上の6件の項目は、select * from table; として、取得したデータをLog.vで出力したものです。 Log.vで出したやつですが、updateはできてます。あかあたか→あかあたかゆのや と変化してます。
yona

2017/04/19 16:13

idが全てnullなのはあなたの考え通りなんですか? ログ出力はもう少し見やすくしてください。 また、メソッドを分けましょうと言っているのを無視しないでください。
edoooooo

2017/04/19 16:23

idは、Listに追加し無いので、取得してい無いため、nullとなっていたのですが、わかりにくくなっていまして申し訳ありませんでした。取得できているものに変更しました。 メソッドは、エラーがなくなったら、手をつけようと思っていました。すみません。
edoooooo

2017/04/19 16:46

while(c.moveToNext()){ Map<String, String> map = new HashMap<String, String>(); のようにmapの定義する場所をwhileの中にすることで、様々なListが表示されるようになりました。 yonaさんありがとうございました。
yona

2017/04/19 17:10

お疲れさまです。 一連の質問でいろいろアドバイスをしました、再度確認してください。 また、コードのコメントから推測するとわからないところをわからないまま進めているみたいですね。腐った土台にはなにも建てられません、一度基礎からやり直したほうがいいです。 書籍を読んだからできるわけではありません、理解したからできるんですよ。 あと、文章の読み書きを勉強して、人に意図を伝える技術も身につけた方がいいです。
edoooooo

2017/04/19 17:14

ありがとうございます。 update文の改善や、select文の改善、さらには、Logの出力や、intentにデータ(id)をもたせて、intentの移動先で、updateの際のwhere文の条件にidを使うなどといった様々な問題の解決がありました。人に伝える上で、わかりやすい文章であるかを客観的に見直してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問