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

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

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

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

Java

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

Q&A

解決済

2回答

538閲覧

SQLiteの値を書き換える

退会済みユーザー

退会済みユーザー

総合スコア0

SQLite

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

Java

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

0グッド

0クリップ

投稿2017/08/28 05:25

渡ってきたint i,xの値に応じたsortの値の入れ替えがしたいです。sortの値がiだったところをxに変えて、xだったところをiに変えたいということです。

下記のようなコードを書いてみました。
心配な点として最初のupdateでsortの値がiになり、そのあとのupdateでwhereでの指定がその前にiに変えたものまで選択されてしまい、結果としてどっちもxになってしまわないかなというものがありましたが、それ以前にLogで表示される値に変化が全くないです。

どこを変えたら実装できますでしょうか?
よろしくお願いします。

public void sortOrder(int i, int x) { SQLPlaceOpenHelper placeOpenHelper = new SQLPlaceOpenHelper(context); SQLiteDatabase database = placeOpenHelper.getWritableDatabase(); try { database.beginTransaction(); database.execSQL("update " + SQLPlaceContract.Place.TABLE_NAME + "set " + SQLPlaceContract.Place.SORT + " = " + i + "where " + SQLPlaceContract.Place.SORT + " = " + x); database.execSQL("update " + SQLPlaceContract.Place.TABLE_NAME + "set " + SQLPlaceContract.Place.SORT + " = " + x + "where " + SQLPlaceContract.Place.SORT + " = " + i); database.setTransactionSuccessful(); } catch (SQLException e) { e.printStackTrace(); } finally { database.endTransaction(); } Cursor c = null; c = database.query( SQLPlaceContract.Place.TABLE_NAME, null, null, null, null, null, null ); Log.v("DB_TEST", "Count : " + c.getCount()); while ((c.moveToNext())) { int id = c.getInt(c.getColumnIndex(SQLPlaceContract.Place._ID)); String name = c.getString(c.getColumnIndex(SQLPlaceContract.Place.PLACE)); int sort= c.getInt(c.getColumnIndex(SQLPlaceContract.Place.SORT)); Log.v("DB_TEST", "id" + id + " name" + name + " sort" + sort); } c.close(); database.close(); } コード

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

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

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

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

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

guest

回答2

0

ベストアンサー

Logの方はよく分かりませんが、更新では懸念されているとおりの結果になると思われます。

値の交換で条件が交換元の値だけの場合には一度に実行しないと、意図通りにはならないでしょう。

一度に実行するためには、
条件では、交換したい値の何れか[ where 更新対象項目 in (i ,x) ]とし、
更新では、条件分岐[ set 更新対象項目 = case 更新対象項目 when i then x else i end ]の様に。

投稿2017/08/29 01:43

sazi

総合スコア25195

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

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

退会済みユーザー

退会済みユーザー

2017/08/30 04:43

ありがとうございます。
guest

0

実行しているSQLをログ出力して確認しましょう。
また、SQL内でCASE式を使わないと思った通りの更新はできないと思いますよ。

投稿2017/08/28 12:36

yona

総合スコア18155

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問