🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

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

Android Studio

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

Q&A

解決済

1回答

1671閲覧

androidstudio ListViewに日付(yyyy/MM/dd)を追加したい

yellowb77

総合スコア5

SQLite

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

Android Studio

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

0グッド

1クリップ

投稿2019/12/10 12:59

編集2019/12/11 01:39

ListViewに日付を追加したい

以下のサイトを参考にして簡易的なメモ帳を作ってみて実際には動き,
ListViewに日付を追加したいのですがSqliteの日付型の指定がよく分からないので
定義の仕方、一覧画面の文字の横に日付の表示(yyyy/MM/dd)また、uuidの非表示の仕方も教えてください。

  • ListActivityjavaの(SELECT uuid,body...)のuuidを消すとエミュレータ起動時、強制終了する。
  • MemoOpenHelperjava Sqliteでの日付型の定義

※文字制限のため全て記述できませんでした。(Sqliteの部分のみ、他のコードは参考サイトと同じです。)
参考サイトで見てください。

参考にしたサイトhttps://high-programmer.com/2017/09/04/android-studio-memo-app-4/

↓現在の状態
![イメージ説明

java

1public class MemoOpenHelper extends SQLiteOpenHelper { 2 3 // データベース名 4 static final private String DBName = "MEMO_DB"; 5 // データベースのバージョン(2,3と挙げていくとonUpgradeメソッドが実行される) 6 static final private int VERSION = 1; 7 8 // コンストラクタ 以下のように呼ぶこと 9 public MemoOpenHelper(Context context){ 10 super(context, DBName, null, VERSION); 11 } 12 13 // データベースが作成された時に実行される処理 14 // データベースはアプリを開いた時に存在しなかったら作成され、すでに存在していれば何もしない 15 @Override 16 public void onCreate(SQLiteDatabase db) { 17 /** 18 * テーブルを作成する 19 * execSQLメソッドにCREATET TABLE命令を文字列として渡すことで実行される 20 * 引数で指定されているものの意味は以下の通り 21 * 引数1 ・・・ id:列名 , INTEGER:数値型 , PRIMATY KEY:テーブル内の行で重複無し , AUTOINCREMENT:1から順番に振っていく 22 * 引数2 ・・・ uuid:列名 , TEXT:文字列型 23 * 引数3 ・・・ body:列名 , TEXT:文字列型 24 */ 25 db.execSQL("CREATE TABLE MEMO_TABLE (" + 26 "id INTEGER PRIMARY KEY AUTOINCREMENT, " + 27 "uuid TEXT, " + 28 "body TEXT)"); 29 30 } 31 32 // データベースをバージョンアップした時に実行される処理 33 @Override 34 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 35 /** 36 * テーブルを削除する 37 */ 38 db.execSQL("DROP TABLE IF EXISTS MEMO_TABLE"); 39 40 // 新しくテーブルを作成する 41 onCreate(db); 42 } 43 44}

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

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

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

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

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

jimbe

2019/12/10 14:46

> Sqliteの日付型(datetime)の指定がよく分からない ドキュメントはお読みになられましたか. その上でどの個所が分からないのかをご説明頂けますか.
guest

回答1

0

ベストアンサー

> uuidの非表示の仕方

data.put("id",uuid);

の下に

data.put("date","");

を追加し,

new String[]{"body","id"}, // どの項目を

new String[]{"body","date"}, // どの項目を

としては如何でしょうか.

uuid が表示されている個所に作成日が表示されるようにした修正箇所のみを書き出します.
修正前をコメントにしてあるので, 修正箇所の手がかりにしてください.
SQL の実行に rawQuery/execSQL が使われていたため, 各専用メソッドに置き換えも行っています.
MemoOpenHelper のバージョンは変えていませんので, 実行時は既存を一度アンインストールしてください.

MemoOpenHelper.java

java

1//db.execSQL("CREATE TABLE MEMO_TABLE (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "uuid TEXT, " + "body TEXT)"); 2db.execSQL("CREATE TABLE MEMO_TABLE (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "uuid TEXT, " + "body TEXT, " + "datetime INTEGER)");

ListActivity.java

java

1(onCreateメソッド内) 2// rawQueryというSELECT専用メソッドを使用してデータを取得する 3//Cursor c = db.rawQuery("select uuid, body from MEMO_TABLE order by id", null); 4Cursor c = db.query("MEMO_TABLE", new String[]{"uuid","body","datetime"}, null,null,null,null, "id"); 5 6: 7 8String body = c.getString(1); 9long datetime = c.getLong(2); //追加 10 11: 12 13data.put("id",uuid); 14data.put("datetime", new SimpleDateFormat("Y-M-d").format(new Date(datetime))); //追加 15 16: 17 18//new String[]{"body","id"}, // どの項目を 19new String[]{"body","datetime"}, // どの項目を 20 21: 22 23(onItemClickメソッド内) 24// 選択されたビューを取得 TwoLineListItemを取得した後、text2の値を取得する 25//TwoLineListItem two = (TwoLineListItem)view; 26//TextView idTextView = (TextView)two.findViewById(android.R.id.text2); 27//TextView idTextView = (TextView)two.getText2(); 28//String idStr = (String) idTextView.getText(); 29String idStr = memoList.get(position).get("id"); 30 31: 32 33(onItemLongClickメソッド内) 34// 選択されたビューを取得 TwoLineListItemを取得した後、text2の値を取得する 35//TwoLineListItem two = (TwoLineListItem)view; 36//TextView idTextView = (TextView)two.getText2(); 37//String idStr = (String) idTextView.getText(); 38String idStr = memoList.get(position).get("id"); 39 40: 41 42//db.execSQL("DELETE FROM MEMO_TABLE WHERE uuid = '"+ idStr +"'"); 43db.delete("MEMO_TABLE", "uuid=?", new String[]{idStr});

CreateMemoActivity.java

java

1(onCreateメソッド内) 2//Cursor c = db.rawQuery("select body from MEMO_TABLE where uuid = '"+ id +"'", null); 3Cursor c = db.query("MEMO_TABLE", new String[]{"body"}, "uuid=?", new String[]{id},null,null,null); 4 5: 6 7(onClickメソッド内) 8 // INSERT 9 //db.execSQL("insert into MEMO_TABLE(uuid, body) VALUES('"+ id +"', '"+ bodyStr +"')"); 10 ContentValues cv = new ContentValues(); 11 cv.put("uuid", id); 12 cv.put("body", bodyStr); 13 cv.put("datetime", System.currentTimeMillis()); 14 db.insert("MEMO_TABLE", null, cv); 15else{ 16 // UPDATE 17 //db.execSQL("update MEMO_TABLE set body = '"+ bodyStr +"' where uuid = '"+id+"'"); 18 ContentValues cv = new ContentValues(); 19 cv.put("body", bodyStr); 20 db.update("MEMO_TABLE", cv, "uuid=?", new String[]{id});

投稿2019/12/10 15:29

編集2019/12/11 11:22
jimbe

総合スコア13204

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

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

yellowb77

2019/12/11 00:59

曖昧に記載してすみません。一般のSqlの型で言うDATETIMEをSqliteの型で言うNUMERICで定義したいということです。実際に動かしてみたのですが、uuidは隠れたものの、日付が表示されません。 MemoOpenHelper(java)でテーブルの列(日付)を定義しなくてもいいのですか?
jimbe

2019/12/11 01:13

ご質問の新しい情報は, ご質問を編集して追加して下さい. 回答の最初に書きました通り,「uuidの非表示」について書いたもので, 日付の表示ではありません. 日付に関しましては, 何の日付を何処にどのような形(書式)で表示するのか分かりませんでしたので, 「質問への依頼」の方に書きました点のみ指摘させて頂きました.
yellowb77

2019/12/11 01:40

質問の内容を少し変えました。確認よろしくお願いします。
jimbe

2019/12/11 02:43

> Sqlの型で言うDATETIMEをSqliteの型で言うNUMERICで定義したい という点がありませんが... > Sqliteの型で言うNUMERICで定義 まず MemoOpenHelper にこの列を追加されては如何でしょうか. そして, NUMERIC でどのように日付を表現するおつもりでしょう. また, その日付とは何の日付でしょうか.
yellowb77

2019/12/11 02:52

新規作成でメモの登録時を 文字の横に(例:2019/12/11)と表示がしたいです。
jimbe

2019/12/11 04:21

その 2019/12/11 という日付をどういう表現で NUMERIC の列に格納するか, お考えがありましたら教えて頂けますか. "文字の横" とは body が表示されている場所の右側ということでしょうか. 現在使用されている行レイアウトは上下2段に表示するもので, "文字の横"と指定して表示できる領域はありません. 必要でしたらレイアウトを作成しなければならないと思います.
yellowb77

2019/12/11 06:35

(%Y-%m-%d) 2019-12-11という形で表示したいです。 xmlはあまり詳しくないので、とりあえず2段目(bodyの下)に表示することにします。 ※表示ができ次第xmlを変更したしたいと思います。
jimbe

2019/12/11 08:53

表示の形式は分かりましたが, お聞きしたいのは保存の形式です. 表示の形式と保存の形式が異なることはご理解頂いていますでしょうか. (%Y-%m-%d) と言うのは SimpleDateFormator のフォーマット文字列でしょうか. とするとエポックタイムで保存するのが簡単かと思いますが, 如何でしょう.
jimbe

2019/12/11 10:16

参照先のプロジェクトを再現してみましたが, 表示されている id はデータとして使用されていました. ですので, この回答のみ行ってしまうと, 修正や削除が出来なくなります. あちこちを修正しなければならないかもしれません.
yellowb77

2019/12/11 10:26

今回、androidstudioを使用してアプリを制作するのも初めて、かつjavaもあまり慣れていないので表示形式、保存形式が異なることは知りませんでした。 SimpleDateFormator のフォーマット文字列(yyyy/MM/dd)で日付パターンを指定したいです。 エポックタイム(自分調べ→基準から何秒経過したかを数値にする)で保存する方向でお願いします。
yellowb77

2019/12/11 11:01

わざわざ検証までして下さってありがとうございます。 選択した行のuuidを探しに行って修正・削除しているのですか? もし迷惑でなければ、修正箇所を教えて頂けますか?
jimbe

2019/12/11 11:42

> 表示形式、保存形式が異なることは知りませんでした いえ, どうするかは設計次第なだけです. 保存したものをそのまま表示する, つまり "2019-12-11" とデータベースに保存することも出来ます. ですがこれは文字列であり, 当初から "NUMERICで" (つまり数値で)と言われていましたので, エポックタイムか, 例えば 年×10000+月×100+日 と計算して 20191211 なんていう数値でも保存はできます. その辺りのことをお聞きしていたのでした. > 選択した行のuuidを探しに行って修正・削除しているのですか? データベースから1件のデータを取り出すには, テーブル内で重複していないデータを条件に指定して QUERY を行います. 件の場合はソレように UUID が用いられています.( id 列があるのですからそれを使えば良いだけなんですけど, 作者さんはその辺りあまり分かっていなかったのでしょうか.) 検索するのは普通なのですが, そのためのデータを表示(しているViewから)から取り出すということは, まず無いと思います. 表示するデータは別途管理されているのですから.
yellowb77

2019/12/12 05:20

ありがとうございました。無事にできました。 削除の場合、長押ししたら消えてしまうので、ダイアログを表示後、削除の流れを作成しようと思います。丁寧に指摘、アドバイスありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問