こんにちは。
知見ある方いましたら、ご教授いただけますと幸いです。
前提
現在の仕事にて、Androidアプリ(java)を開発しております。
アプリ内部のDB(sqlite3)にて、以下のようなデータのテーブルが既存実装として存在しております。
既存仕様
DBについて
ユーザーID | データID |
---|---|
1234567 | 1 |
2345678 | 2 |
- ID : Integer primary key
- アプリにてサインインしたユーザーのIDを格納している
- データID : Integer
- サインインしたユーザーが使用する、他のDBに保存されている設定のどれを使用するか?を判断できるIDを格納している
補足
- アプリは、サインインして利用することが前提となっている
- サインイン完了時に、ユーザーIDをSharedPreferenceに保存している
- サインイン後に遷移できるある画面にて、上記DBへの保存が実施できる
修正したい問題
- アプリの仕様が変わり、サインインなしでもアプリの利用が可能になった。
- 未サインインの状態で、上記の上記DBへの保存が行える画面に遷移し、保存できるようになったため、永続時に必要なユーザーIDが存在しないパターンが発生する様になった
- そのため、保存を行うと現在は
android.database.sqlite.SQLiteDatatypeMissmatchException
となり、SQLiteDatabase#insert()
に失敗している状態
問題に対する現在の修正案
- DBへのinsert()実行時、未サインイン(ユーザーIDが取得出来なかった)場合は、ダミーとなる
-1
をユーザーIDとして、保存を行う - ※-1としている理由
- サインインに成功している時のユーザーIDは必ず自然数となるため、重複を避けるため
うまくいっていない点
- ユーザーIDのカラムには、primary keyが指定されているためか、
-1
を格納出来ない。 SQLiteDatatypeMissmatchException
などは発生しておらずSQLiteDatabase#insert()
の戻り値が、失敗を意味する-1が必ず帰ってくる状態- 暫定として、
0
、1
を指定した場合は、insert出来た - 暫定として、ユーザーIDカラムのprimary keyの指定をやめた場合、
-1
をinsert出来た
実現したいこと(知りたいこと)
- 暫定として、0、1を指定した場合は、insert出来た
- 暫定として、ユーザーIDカラムのprimary keyの指定をやめた場合、-1をinsert出来た
上記の動作は、Sqliteの仕様なのでしょうか?
調査を行ったのですが、明示的な仕様を見つけられず・・
ご教授いただけると幸いです。
また、その他-1を指定する以外の対応方法のアイディアをお持ちの方いましたら、
ご教授いただけますと幸いです。
該当のソースコード
業務上コードのため、省略させていただきます。。
概要としては以下の様な形です。
java
1 2/** 3** パラメータで、前述でいう「データID」を受け取ります。 4*// 5synchronizeed boolean hogehoge(int id) { 6 ContentValues values = new ContentValues(); 7 // 前述でいう、「ユーザーID」を受け取りますが、未サインインのため、""が返ってくる様になってしまいました 8 values .put("ユーザーIDのテーブル名", getUserID()); 9 values .put("データIDのテーブル名", id); 10 try{ 11 // SQLiteDatabaseの生成処理は省略します 12 13 long rowId = SQLiteDatabase.insert("テーブル名", null, values); 14 // 上記rowIdで-1となり失敗する 15 // getUserID()の箇所を-1に変更した場合も同様 16 } finnay { 17 } 18}
補足情報(FW/ツールのバージョンなど)
- Android Studio 2021.2.1 Patch 2
- Android 12.0(エミュレータ Pixel 4)
- SQLite3
回答2件
あなたの回答
tips
プレビュー