閲覧ありがとうございます。
専門の知識が乏しいため読みづらかったり、用語の使い方が間違っていたりすると思いますが、何卒よろしくお願いします。
SQLiteを用いてデータ保存をするAndroidアプリの開発中、実機に繋いでインストールし実行していました。
今までデータの読み書きともに正常に行えていたのですが、一旦本体の設定からアプリのデータ削除をしたところ、途端に読み書きともに行えなくなってしまいました。(SQLiteDatabaseオブジェクトをヘルパーからgetReadableDatabase/getWritableDatabaseで開く処理だけtry文に入れるとSQLiteExceptionをcatchしました)
自分では経験・知識ともに浅く、また調べても同じようなケースが見当たらないため、原因や解決方法を教えて頂きたいです。よろしくお願いします。
(ソースコードですが、どの部分を載せるべきか判断しかねましたので、ご指摘いただいてから記載したいと思います)
追記(10/22/20:10):ご指摘いただきましたのでソースコードを追記いたしました。
乱雑で読みづらいコードで申し訳ありません。必要ないと思われる箇所は適宜省略しましたが、いかんせんどこを載せたらよいのかわからず、無駄な部分が多いと思いますがご容赦ください。
また、ご要望頂いておりますエラーログですが、LogCatの調子が悪く全く出力されなくなっているため、自分も把握できていない状況です。申し訳ありません。
###該当のソースコード
java
1public class MainActicity extends FragmentActivity { 2 //扱うitemを管理 3 ArrayList<Item> items = new ArrayList<Item>(); 4 5 //各種数値 6 private int[] values; 7 /* 8 * valuesはアクティビティ全体として保持すべき数値のうち、 9 * データベースに保存すべきもの。 10 * SALES_AMOUNT = 総売り上げ額 11 */ 12 private final int SALES_AMOUNT = 0; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 //各ViewをfindViewByIdしたりOnClickを実装したりしていますが省略 20 21 //データロード 22 values = DataUtils.load(this,items); 23 } 24 25 @Override 26 protected void onPause() { 27 DataUtils.store(this,values); 28 super.onPause(); 29 } 30} 31 32public class Item { 33 //商品名 34 public String name; 35 36 //設定価格 37 public int price; 38 39 //売上個数 40 private int sales; 41 42 43 //コンストラクタ 44 public Item(String name, int price, int sales) { 45 this.name = name; 46 this.price = price; 47 this.sales = sales; 48 } 49 50 //セッター 51 public void setName(String name) { 52 this.name = name; 53 } 54 public void setPrice(int price) { 55 this.price = price; 56 } 57 58 //ゲッター 59 public String getName(){ 60 return this.name; 61 } 62 public int getPrice(){ 63 return this.price; 64 } 65 public int getSales(){ 66 return this.sales; 67 } 68 69} 70 71public class MySQLiteOpenHelper extends SQLiteOpenHelper { 72 //データベース・テーブル・カラム・レコード作成用の値はすべてDataUtilsクラスで管理 73 static final String DB_NAME = DataUtils.DB_NAME; 74 static final int DB_VERSION = DataUtils.DB_VERSION; 75 static final String TABLE_NAME_ITEM = DataUtils.TABLE_NAME_ITEM; 76 static final String TABLE_NAME_INTEGER = DataUtils.TABLE_NAME_INTEGER; 77 static final String COLUMN_NAME_ID = DataUtils.COLUMN_NAME_ID; 78 static final String COLUMN_NAME_ITEM_NAME = DataUtils.COLUMN_NAME_ITEM_NAME; 79 static final String COLUMN_NAME_ITEM_PRICE = DataUtils.COLUMN_NAME_ITEM_PRICE; 80 static final String COLUMN_NAME_ITEM_SALES = DataUtils.COLUMN_NAME_ITEM_SALES; 81 static final String COLUMN_NAME_INTEGER_NOMINAL = DataUtils.COLUMN_NAME_INTEGER_NOMINAL; 82 static final String COLUMN_NAME_INTEGER_VALUE = DataUtils.COLUMN_NAME_INTEGER_VALUE; 83 static final String RECORD_NAME_SALESAMOUNT = DataUtils.RECORD_NAME_SALESAMOUNT; 84 85 //コンストラクタ 86 public MySQLiteOpenHelper(Context context) { 87 super(context, DB_NAME, null, DB_VERSION); 88 } 89 90 /** 91 * 初回作成時に呼ばれる 92 * テーブルを作成する 93 */ 94 @Override 95 public void onCreate(SQLiteDatabase db) { 96 //Item用テーブル作成 97 db.execSQL("CREATE TABLE " + TABLE_NAME_ITEM + " (" 98 + COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 99 + COLUMN_NAME_ITEM_NAME + " TEXT NOT NULL," 100 + COLUMN_NAME_ITEM_PRICE + " INTEGER NOT NULL," 101 + COLUMN_NAME_ITEM_SALES + " INTEGER NOT NULL)"); 102 //整数用テーブル作成 103 db.execSQL("CREATE TABLE " + TABLE_NAME_INTEGER + " (" 104 + COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 105 + COLUMN_NAME_INTEGER_NOMINAL + "TEXT PRIMARY KEY NOT NULL" 106 + COLUMN_NAME_INTEGER_VALUE + " INTEGER)"); 107 db.execSQL("INSERT INTO " + TABLE_NAME_INTEGER + " VALUES(" 108 + RECORD_NAME_SALESAMOUNT + ",0)"); 109 } 110 111 /** 112 * データベースの更新が必要な時に呼ばれる 113 * テーブルを作り直す 114 */ 115 @Override 116 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 117 118 } 119 120} 121 122public class DataUtils { 123 124 //データベース 125 private static MySQLiteOpenHelper mySQLiteOpenHelper; 126 private static SQLiteDatabase DB; 127 //データベース名 128 static final String DB_NAME = "myregister.db"; 129 //データベースバージョン 130 static final int DB_VERSION = 1; 131 //テーブル名 132 static final String TABLE_NAME_ITEM = "item_table"; 133 static final String TABLE_NAME_INTEGER = "integer_table"; 134 //カラム名 135 static final String COLUMN_NAME_ID = "_id"; 136 static final String COLUMN_NAME_ITEM_NAME = "name"; 137 static final String COLUMN_NAME_ITEM_PRICE = "price"; 138 static final String COLUMN_NAME_ITEM_SALES = "sales"; 139 static final String COLUMN_NAME_INTEGER_NOMINAL = "nominal"; 140 static final String COLUMN_NAME_INTEGER_VALUE = "value"; 141 //INTEGERテーブルのレコード名 142 static final String RECORD_NAME_SALESAMOUNT = "salesAmount"; 143 144 protected static int[] load(Activity activity, ArrayList<Item> items) { 145 mySQLiteOpenHelper = new MySQLiteOpenHelper(activity.getApplicationContext()); 146 147 try{ 148 //データベースを読み取り専用で開く 149 DB = mySQLiteOpenHelper.getReadableDatabase(); 150 }catch(SQLiteException e) { 151 //異常終了 152 //ここで引っかかってしまう(トーストが出る)******************************** 153 Toast.makeText(activity, "データベースを開けません", Toast.LENGTH_SHORT).show(); 154 return null; 155 } 156 try{ 157 //itemテーブルからデータを取得 158 Cursor c; 159 c = DB.rawQuery("SELECT * " 160 + "FROM " + TABLE_NAME_ITEM + " " 161 + "ORDER BY " + COLUMN_NAME_ID + " ASC" 162 , null); 163 164 //取得したデータからitemsを復元 165 if(c.moveToFirst()){ 166 //レコードが存在する場合、ID順にitemsにItemオブジェクトを作成 167 do{ 168 items.add(new Item (c.getString (c.getColumnIndex(COLUMN_NAME_ITEM_NAME)), 169 c.getInt (c.getColumnIndex(COLUMN_NAME_ITEM_PRICE)), 170 c.getInt(c.getColumnIndex(COLUMN_NAME_ITEM_SALES)) ) ); 171 }while(c.moveToNext()); 172 }else{ 173 //レコードが存在しない場合の処理 174 } 175 176 177 //integerテーブルからデータ取得 178 int[] values = new int[1]; 179 c = DB.rawQuery("SELECT * " 180 + "FROM " + TABLE_NAME_INTEGER + " " 181 + "ORDER BY " + COLUMN_NAME_ID + " ASC" 182 , null); 183 184 int n = 0; 185 if(c.moveToFirst()){ 186 do{ 187 values[n] = c.getInt(c.getColumnIndex(COLUMN_NAME_INTEGER_VALUE)); 188 n++; 189 }while(c.moveToNext()); 190 }else{ 191 //レコードが存在しない場合の処理 192 } 193 194 195 DB.close(); 196 197 return values; 198 }catch(SQLiteException e){ 199 //異常終了 200 Toast.makeText(activity, "データ取得に失敗しました", Toast.LENGTH_SHORT).show(); 201 return null; 202 } 203 204 } 205 206 /** 207 * データベースへデータを保存 208 */ 209 protected static void store(Activity activity, int[] values){ 210 mySQLiteOpenHelper = new MySQLiteOpenHelper(activity.getApplicationContext()); 211 try{ 212 //データベースを書き込み可能で開く 213 DB = mySQLiteOpenHelper.getWritableDatabase(); 214 215 //INTEGERテーブルに値を保存 216 for(int i=0;i<values.length;i++){ 217 DB.execSQL("UPDATE " + TABLE_NAME_INTEGER + " " 218 + "SET " + COLUMN_NAME_INTEGER_VALUE + "=" + values[i] + " " 219 + "WHERE " + COLUMN_NAME_ID + "=" + String.valueOf(i+1)); 220 } 221 222 DB.close(); 223 }catch(SQLiteException e) { 224 //異常終了 225 //ここも引っかかる(トーストが出る)******************** 226 Toast.makeText(activity, "保存に失敗しました", Toast.LENGTH_SHORT).show(); 227 return; 228 } 229 } 230}
###試したこと
一度データ削除をしたことで、データベース自体かもしくはテーブルが無くなり、ヘルパーのonCreateが上手く作動してないのかと思い、データベースの中身を見ようと試行錯誤しましたがそもそも見つからずじまいでした。
回答1件
あなたの回答
tips
プレビュー