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

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

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

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

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1057閲覧

Kotlinでデータの四則演算した結果を更新する方法

Haruto513

総合スコア52

SQLite

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

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/02/10 05:41

Androidアプリ開発の勉強を行っている最中です。
現在データベースの操作について学習しているのですが、データの更新を行う際、元のデータから指定した数を加減するという処理を行いたいと考えています。
execSQL()ではなく、updateを使おうと思っています。

試したこと

Kotlin

1var cash : Int = 40000 2 3val helper = DatabaseHelper(this@MainActivity) 4val db = helper.writableDatabase 5 6try { 7 db.beginTransaction() 8 val value = ContentValues() 9 value.put("remainder", "remainder - ${cash}") 10 db.update("Bank", value, "_id = ?", arrayOf("1")) 11}catch (e: Exception) { 12 db.execSQL("ROLLBACK TRANSACTION;") 13 return 14}finally { 15 db.setTransactionSuccessful() 16 db.endTransaction() 17} 18

上記のように書くと、そのままremainderカラムの中のデータが数字ではなく、文字列で**remainder - ${cash}**という風に更新されてしまいました。

Kotlin

1db.execSQL("UPDATE Bank SET remainder = remainder - ${cash} WHERE _id = 1;")

上記のように書いた時と同じような更新を行いたいのですが、KotlinでSQLiteデータベースの操作で四則演算を行うときはどうすればいいでしょうか。それとも、db.execSQL()を使ったの方がいいのでしょうか。
ご教示頂けると助かります。

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

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

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

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

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

dodox86

2020/02/10 06:08

remainderカラムの属性はtextなのだと思いますが、"UPDATE Bank SET remainder = remainder - ${cash} WHERE _id = 1" のSQLについて、 例えばremainderカラムに"10" と入っていて、cachが3 だった場合、UPDATE実行後にremaiderカラムには"10 - 3"と入れたいのでしょうか。それとも"7" と入れたいのでしょうか。それともまた別のかたちですか。
Haruto513

2020/02/10 06:20

最初にDatabaseHelperクラスを作った時、onCreateの中でdb?.execSQL("CREATE TABLE Bank (_id INTEGER PRIMARY KEY, account TEXT NOT NULL, remainder INTEGER NOT NULL);")でテーブルを作成しているのですが、一応remainderのデータ型はINTEGERでTEXTではありません。 どうやらSQLiteはカラムにデータ型を指定しても無視される?とこのページにて→https://blog.ohgaki.net/sqlite-data-type-specification#i書かれていました。 このUPDATEでは、remainderには「7」を入れたいと思っています。
hoshi-takanori

2020/02/10 09:54

db.update() を使う方法では更新したい値を remainder - ${cash} のような式で指定することはできず、計算結果(つまり DB から remainder の値を取得して remainder - cash を Kotlin 側で計算して)指定する必要があります。ので、この場合は db.execSQL() を使った方がいいと思います。
Haruto513

2020/02/12 00:23

hoshi-takanori様回答ありがとうございます。 個人でも色々調べたところ、やはりexecSQLを使ったほうが、書く量を節約できるので、そちらの方がいいのでしょうね。ご協力ありがとうございました。
hoshi-takanori

2020/02/12 00:37

コードの量も違いますが、一番の違いは db.execSQL() を使った方はアトミックな処理であるのに対して、db.update() を使うにはまず db.query() を実行して元の remainder を取得し、1 を加えて db.update() で書き戻すという二回に分けた SQL 呼び出しを行う必要が生じるという点ですね。(Android ではレースコンディションを心配する必要はほとんどありませんが…。)
guest

回答1

0

自己解決

update()では、引数の値に式を指定することはできないようなので、
execSQL("UPDATE テーブル名 SET カラム名=計算式")というように書く方がこの場合は簡単のようです。

御協力してくださった方々、ありがとうございました!

投稿2020/02/12 00:27

Haruto513

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問