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

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

ただいまの
回答率

87.35%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 356

score 26

お世話になっております。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を使い、データを抽出しております。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • EveryoneCanEat

    2019/10/13 16:04

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

    キャンセル

  • dodox86

    2019/10/13 16:18

    > 自分でidをふっていった場合、AUTINCREMENTのシーケンスには、問題ありませんでしょうか…?
    AUTOINCREMENTをつけているカラムに自分でID振ったら、普通は問題あります。AUTOINCREMENTされる番号は、sqlite_sequenceテーブルに保存されています。INSERT時に不用意に自分でIDを振った場合、衝突すると思います。使うなら、問題ないように自分でハンドリングする必要があります。

    > 自分でidをふれば、deleteでidのみ残ってしまう、
    すみません。「delete でidのみ残ってしまう」と言う意味が相変わらず分かりません。ですので回答いたしかねます。コメントでの質問の範疇を超えているように思いましたので、すみませんがこの辺で。

    キャンセル

  • EveryoneCanEat

    2019/10/13 16:24

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

    キャンセル

回答 1

check解決した方法

0

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

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

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

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

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


2019/10/13  PM18:15

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る