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

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

詳細はこちら
SQLite

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

Java

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

Android

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

Q&A

解決済

1回答

520閲覧

sqlite削除したレコード以外を抽出したいです。

EveryoneCanEat

総合スコア40

SQLite

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

Java

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

Android

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

0グッド

0クリップ

投稿2019/10/13 05:54

お世話になっております。Android開発初心者です。

リストビューでデータベースのデータを表示しているのですが、sqliteのAUTOINCREMENT制約の為に、リストビュー表示のidと、リストビュー項目クリック時の詳細画面遷移後のidとで不整合が発生し、詳細画面データを、削除した項目以外と該当idとを、'&'を使って抽出したいと存じます。

例えば、項目を削除した場合、リストビュー項目は、以下のように表示されますが、
<id=4を削除した場合>
test1 id=1
test2 id=2
test3 id=3
test4 id=5
test5 id=6

クリック後の詳細画面では、

test1 id=1
test2 id=2
test3 id=3
test4 リストから消失
test5 id=4(空白画面)[リストタップのポジションは4です。]

リスト長押しで、項目がリストから削除される処理の為に、リストをタップしたポジションが4番目の際に、詳細画面のidが削除されたレコードを表示してしまい、中身が空白になっております。

AUTOINCREMENT制約をつけてもつけなくても結果は変わらず、削除項目が、「リストでは歯抜けで詰められる」「詳細画面では空白」という不整合が発生しております。

リストのidと、詳細画面のidを一致させる為に、計算してidを合わせましたが、
(現在の番号より小さい削除データが何個あるか、その個数をidに足す)
一度の削除では、上手く動くのですが、二度、三度、削除を繰り返しますと、
クリックリスナーのポジションは、データベースのidではなく、「クリックされた位置」を表すので、例えば「4番目の'id=5'をクリック」した際に、詳細画面では消失したid=4の空白になってしまいます。

データベースは果てしないもの、として捉えておりますので、全て計算のみで解決しようとしても不整合が起こる可能性があり、バグ発生の可能性も大きく、うまい方法が無いのか、悩んでおります。

私の考えましたことと致しまして、詳細画面でデータベースを読む際に、「空白以外を表示」させることで、問題解決に繋がる可能性があるのではないか、と思い、主題通り、”削除したレコード以外を抽出する方法”を模索しております。

抽出時に「is not null」も使ってみましたが、効果はありませんでした。

詳細画面のコードは
select実行後、普通に、

text1.setText(c5.getString(0)); text2.setText(c5.getString(1)); text3.setText(c5.getString(2)); text4.setText(c5.getString(3)); text5.setText(c5.getString(4));

このようにCursorを使い、データを抽出しております。

問題解決につきまして、ご見当がつきましたら、ご教授の程、宜しくお願い申し上げます。

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

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

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

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

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

dodox86

2019/10/13 06:05

そもそも、もとの設計(DBと画面の連携方法)に無理があるような気がします。AUTOINCREMENTで番号付けしてしまったら、例えばDELETE FROM tblで全件削除した場合、次の番号は1から始まりません。そのことは置いておいても、「削除したレコード以外を抽出する方法」と言うのがどうも意味が分かりません。DB上からレコードを削除したら、そのレコードは消滅しているのだから、抽出する必要は無いのではないですか?それとも、DELETE文で削除したわけではないのでしょうか。
EveryoneCanEat

2019/10/13 06:06

ご教授、ありがとうございます。 レコードは、deleteで削除致しました。
EveryoneCanEat

2019/10/13 06:08

sqliteの場合は、削除データの、idのみが残ってしまうようです。
EveryoneCanEat

2019/10/13 06:10

実際、削除したidをselectで抽出しております。中身は空ですが。
dodox86

2019/10/13 06:20

ごめんなさい、ちょっと意味が分かりません。例えば削除対象のテーブルのカラムにIDがあり、DELETE FROM table WHERE ID=1; とした後、IDの1はどこかに残っていて使っているのだけれど、SELECT * FROM table WHERE ID=1; としたら、削除済みなので空になっている、と言う意味でしょうか? 全貌が理解できないので、私の力では回答は無理そうです。すみません。
EveryoneCanEat

2019/10/13 06:22

AUTINCREMENT制約をsqliteで外すことは不可能でしょうか…? 実際、AUTINCREMENTを外しても結果は変わらないので、そこから、ぐるぐる悩んでおります。
EveryoneCanEat

2019/10/13 06:23

ご多忙の中、申し訳ありませんでした、m(__)m!!
dodox86

2019/10/13 06:30

決して悪気があってお聞きするのではないのですが、質問者さんはもしかすると、日本語は第2、第3言語の方でしょうか。留学生の方とか。もしそうであったなら、こちらこそ大変失礼致しました。
dodox86

2019/10/13 06:39

> AUTINCREMENT制約をsqliteで外すことは不可能でしょうか? 別に不可能ではありません。私はインデックスが不要だったり、連番が不要なデータのテーブルなら、外してCREATE TABLEします。プログラムでの表示方法の工夫次第です。
EveryoneCanEat

2019/10/13 06:41

語学も勉強させて頂いておりますが、純日本人です。 dodox86様には、以前もご協力頂きましたのを覚えております。 ありがとうございます。
EveryoneCanEat

2019/10/13 06:45

ご教授、誠にありがとうございます!! AUTINCREMENT制約は外せないもの、と、思い込んでおりました。 AUTINCREMENT制約を外せるなら、解決の糸口が見つかるかもしれません。 本当にありがとうございます、m(__)m!!
dodox86

2019/10/13 06:48

重ねての失礼、申し訳ありませんでした。ひとつ言えるのは「AUTOINCREMENT制約の為に、リストビュー表示のidと、リストビュー項目クリック時の詳細画面遷移後のidとで不整合が発生」と言う問題は、AUTOINCREMENT制約が悪いのではなく、AUTOINCREMENT制約で生成したIDに依存したプログラムの組み方に問題がある、と私は思います。(いずれにせよ回答未満です)
EveryoneCanEat

2019/10/13 07:03

自分でidをふっていった場合、AUTINCREMENTのシーケンスには、問題ありませんでしょうか…? 自分でidをふれば、deleteでidのみ残ってしまう、ということは、裂けられるのではないでしょうか…?
EveryoneCanEat

2019/10/13 07:04

裂けられる、ではなくて、避けられるです、申し訳ありません。
dodox86

2019/10/13 07:18

> 自分でidをふっていった場合、AUTINCREMENTのシーケンスには、問題ありませんでしょうか…? AUTOINCREMENTをつけているカラムに自分でID振ったら、普通は問題あります。AUTOINCREMENTされる番号は、sqlite_sequenceテーブルに保存されています。INSERT時に不用意に自分でIDを振った場合、衝突すると思います。使うなら、問題ないように自分でハンドリングする必要があります。 > 自分でidをふれば、deleteでidのみ残ってしまう、 すみません。「delete でidのみ残ってしまう」と言う意味が相変わらず分かりません。ですので回答いたしかねます。コメントでの質問の範疇を超えているように思いましたので、すみませんがこの辺で。
EveryoneCanEat

2019/10/13 07:24

誠にありがとうございました。
guest

回答1

0

自己解決

主題とは少しずれておりますが、何を解決したかったか、と、申し上げますと、

リストビューの項目を長押しで削除した場合、リストからは削除項目が消えるのに、項目クリック後の詳細画面で、削除データが空白で表示されてしまって、正しくクリック項目の詳細が表示されない場合があったのですが、

結果、自分で何度も何度もテストして、データを集めて、計算して正解値を得るしかない、という結論に至りました。

主題のように、削除したレコード以外を抽出できたとしても、「リストでクリックした部分」と「詳細表示処理の部分」のidを繋がなければならないので、どうしても「正しいidの値」を割り出さなくてはなりません。

お読み頂き、誠にありがとうございました。


2019/10/13 PM18:15

「正しいidの値」の計算の法則、見つけました!!
お付き合い頂き、誠にありがとうございました。

投稿2019/10/13 08:06

編集2019/10/13 09:16
EveryoneCanEat

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問