質問編集履歴

3

ソースコードを追記、エラーログに関する報告

2017/10/22 11:21

投稿

rinchu_17
rinchu_17

スコア24

test CHANGED
File without changes
test CHANGED
@@ -16,13 +16,479 @@
16
16
 
17
17
  (ソースコードですが、どの部分を載せるべきか判断しかねましたので、ご指摘いただいてから記載したいと思います)
18
18
 
19
+ 追記(10/22/20:10):ご指摘いただきましたのでソースコードを追記いたしました。
20
+
21
+ 乱雑で読みづらいコードで申し訳ありません。必要ないと思われる箇所は適宜省略しましたが、いかんせんどこを載せたらよいのかわからず、無駄な部分が多いと思いますがご容赦ください。
22
+
23
+
24
+
25
+ また、ご要望頂いておりますエラーログですが、LogCatの調子が悪く全く出力されなくなっているため、自分も把握できていない状況です。申し訳ありません。
26
+
19
27
 
20
28
 
21
29
  ###該当のソースコード
22
30
 
23
31
  ```java
24
32
 
25
-
33
+ public class MainActicity extends FragmentActivity {
34
+
35
+ //扱うitemを管理
36
+
37
+ ArrayList<Item> items = new ArrayList<Item>();
38
+
39
+
40
+
41
+ //各種数値
42
+
43
+ private int[] values;
44
+
45
+ /*
46
+
47
+ * valuesはアクティビティ全体として保持すべき数値のうち、
48
+
49
+ * データベースに保存すべきもの。
50
+
51
+ * SALES_AMOUNT = 総売り上げ額
52
+
53
+ */
54
+
55
+ private final int SALES_AMOUNT = 0;
56
+
57
+
58
+
59
+ @Override
60
+
61
+ protected void onCreate(Bundle savedInstanceState) {
62
+
63
+ super.onCreate(savedInstanceState);
64
+
65
+ setContentView(R.layout.activity_main);
66
+
67
+
68
+
69
+ //各ViewをfindViewByIdしたりOnClickを実装したりしていますが省略
70
+
71
+
72
+
73
+ //データロード
74
+
75
+ values = DataUtils.load(this,items);
76
+
77
+ }
78
+
79
+
80
+
81
+   @Override
82
+
83
+ protected void onPause() {
84
+
85
+ DataUtils.store(this,values);
86
+
87
+ super.onPause();
88
+
89
+ }
90
+
91
+ }
92
+
93
+
94
+
95
+ public class Item {
96
+
97
+ //商品名
98
+
99
+ public String name;
100
+
101
+
102
+
103
+ //設定価格
104
+
105
+ public int price;
106
+
107
+
108
+
109
+ //売上個数
110
+
111
+ private int sales;
112
+
113
+
114
+
115
+
116
+
117
+ //コンストラクタ
118
+
119
+ public Item(String name, int price, int sales) {
120
+
121
+ this.name = name;
122
+
123
+ this.price = price;
124
+
125
+ this.sales = sales;
126
+
127
+ }
128
+
129
+
130
+
131
+ //セッター
132
+
133
+ public void setName(String name) {
134
+
135
+ this.name = name;
136
+
137
+ }
138
+
139
+ public void setPrice(int price) {
140
+
141
+ this.price = price;
142
+
143
+ }
144
+
145
+
146
+
147
+ //ゲッター
148
+
149
+ public String getName(){
150
+
151
+ return this.name;
152
+
153
+ }
154
+
155
+ public int getPrice(){
156
+
157
+ return this.price;
158
+
159
+ }
160
+
161
+ public int getSales(){
162
+
163
+ return this.sales;
164
+
165
+ }
166
+
167
+
168
+
169
+ }
170
+
171
+
172
+
173
+ public class MySQLiteOpenHelper extends SQLiteOpenHelper {
174
+
175
+ //データベース・テーブル・カラム・レコード作成用の値はすべてDataUtilsクラスで管理
176
+
177
+ static final String DB_NAME = DataUtils.DB_NAME;
178
+
179
+ static final int DB_VERSION = DataUtils.DB_VERSION;
180
+
181
+ static final String TABLE_NAME_ITEM = DataUtils.TABLE_NAME_ITEM;
182
+
183
+ static final String TABLE_NAME_INTEGER = DataUtils.TABLE_NAME_INTEGER;
184
+
185
+ static final String COLUMN_NAME_ID = DataUtils.COLUMN_NAME_ID;
186
+
187
+ static final String COLUMN_NAME_ITEM_NAME = DataUtils.COLUMN_NAME_ITEM_NAME;
188
+
189
+ static final String COLUMN_NAME_ITEM_PRICE = DataUtils.COLUMN_NAME_ITEM_PRICE;
190
+
191
+ static final String COLUMN_NAME_ITEM_SALES = DataUtils.COLUMN_NAME_ITEM_SALES;
192
+
193
+ static final String COLUMN_NAME_INTEGER_NOMINAL = DataUtils.COLUMN_NAME_INTEGER_NOMINAL;
194
+
195
+ static final String COLUMN_NAME_INTEGER_VALUE = DataUtils.COLUMN_NAME_INTEGER_VALUE;
196
+
197
+ static final String RECORD_NAME_SALESAMOUNT = DataUtils.RECORD_NAME_SALESAMOUNT;
198
+
199
+
200
+
201
+ //コンストラクタ
202
+
203
+ public MySQLiteOpenHelper(Context context) {
204
+
205
+ super(context, DB_NAME, null, DB_VERSION);
206
+
207
+ }
208
+
209
+
210
+
211
+ /**
212
+
213
+ * 初回作成時に呼ばれる
214
+
215
+ * テーブルを作成する
216
+
217
+ */
218
+
219
+ @Override
220
+
221
+ public void onCreate(SQLiteDatabase db) {
222
+
223
+ //Item用テーブル作成
224
+
225
+ db.execSQL("CREATE TABLE " + TABLE_NAME_ITEM + " ("
226
+
227
+ + COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
228
+
229
+ + COLUMN_NAME_ITEM_NAME + " TEXT NOT NULL,"
230
+
231
+ + COLUMN_NAME_ITEM_PRICE + " INTEGER NOT NULL,"
232
+
233
+ + COLUMN_NAME_ITEM_SALES + " INTEGER NOT NULL)");
234
+
235
+ //整数用テーブル作成
236
+
237
+ db.execSQL("CREATE TABLE " + TABLE_NAME_INTEGER + " ("
238
+
239
+ + COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
240
+
241
+ + COLUMN_NAME_INTEGER_NOMINAL + "TEXT PRIMARY KEY NOT NULL"
242
+
243
+ + COLUMN_NAME_INTEGER_VALUE + " INTEGER)");
244
+
245
+ db.execSQL("INSERT INTO " + TABLE_NAME_INTEGER + " VALUES("
246
+
247
+ + RECORD_NAME_SALESAMOUNT + ",0)");
248
+
249
+ }
250
+
251
+
252
+
253
+ /**
254
+
255
+ * データベースの更新が必要な時に呼ばれる
256
+
257
+ * テーブルを作り直す
258
+
259
+ */
260
+
261
+ @Override
262
+
263
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
264
+
265
+
266
+
267
+ }
268
+
269
+
270
+
271
+ }
272
+
273
+
274
+
275
+ public class DataUtils {
276
+
277
+
278
+
279
+ //データベース
280
+
281
+ private static MySQLiteOpenHelper mySQLiteOpenHelper;
282
+
283
+ private static SQLiteDatabase DB;
284
+
285
+ //データベース名
286
+
287
+ static final String DB_NAME = "myregister.db";
288
+
289
+ //データベースバージョン
290
+
291
+ static final int DB_VERSION = 1;
292
+
293
+ //テーブル名
294
+
295
+ static final String TABLE_NAME_ITEM = "item_table";
296
+
297
+ static final String TABLE_NAME_INTEGER = "integer_table";
298
+
299
+ //カラム名
300
+
301
+ static final String COLUMN_NAME_ID = "_id";
302
+
303
+ static final String COLUMN_NAME_ITEM_NAME = "name";
304
+
305
+ static final String COLUMN_NAME_ITEM_PRICE = "price";
306
+
307
+ static final String COLUMN_NAME_ITEM_SALES = "sales";
308
+
309
+ static final String COLUMN_NAME_INTEGER_NOMINAL = "nominal";
310
+
311
+ static final String COLUMN_NAME_INTEGER_VALUE = "value";
312
+
313
+ //INTEGERテーブルのレコード名
314
+
315
+ static final String RECORD_NAME_SALESAMOUNT = "salesAmount";
316
+
317
+
318
+
319
+ protected static int[] load(Activity activity, ArrayList<Item> items) {
320
+
321
+ mySQLiteOpenHelper = new MySQLiteOpenHelper(activity.getApplicationContext());
322
+
323
+
324
+
325
+ try{
326
+
327
+ //データベースを読み取り専用で開く
328
+
329
+ DB = mySQLiteOpenHelper.getReadableDatabase();
330
+
331
+ }catch(SQLiteException e) {
332
+
333
+ //異常終了
334
+
335
+ //ここで引っかかってしまう(トーストが出る)********************************
336
+
337
+ Toast.makeText(activity, "データベースを開けません", Toast.LENGTH_SHORT).show();
338
+
339
+ return null;
340
+
341
+ }
342
+
343
+ try{
344
+
345
+ //itemテーブルからデータを取得
346
+
347
+ Cursor c;
348
+
349
+ c = DB.rawQuery("SELECT * "
350
+
351
+ + "FROM " + TABLE_NAME_ITEM + " "
352
+
353
+ + "ORDER BY " + COLUMN_NAME_ID + " ASC"
354
+
355
+ , null);
356
+
357
+
358
+
359
+ //取得したデータからitemsを復元
360
+
361
+ if(c.moveToFirst()){
362
+
363
+ //レコードが存在する場合、ID順にitemsにItemオブジェクトを作成
364
+
365
+ do{
366
+
367
+ items.add(new Item (c.getString (c.getColumnIndex(COLUMN_NAME_ITEM_NAME)),
368
+
369
+ c.getInt (c.getColumnIndex(COLUMN_NAME_ITEM_PRICE)),
370
+
371
+ c.getInt(c.getColumnIndex(COLUMN_NAME_ITEM_SALES)) ) );
372
+
373
+ }while(c.moveToNext());
374
+
375
+ }else{
376
+
377
+ //レコードが存在しない場合の処理
378
+
379
+ }
380
+
381
+
382
+
383
+
384
+
385
+ //integerテーブルからデータ取得
386
+
387
+ int[] values = new int[1];
388
+
389
+ c = DB.rawQuery("SELECT * "
390
+
391
+ + "FROM " + TABLE_NAME_INTEGER + " "
392
+
393
+ + "ORDER BY " + COLUMN_NAME_ID + " ASC"
394
+
395
+ , null);
396
+
397
+
398
+
399
+ int n = 0;
400
+
401
+ if(c.moveToFirst()){
402
+
403
+ do{
404
+
405
+ values[n] = c.getInt(c.getColumnIndex(COLUMN_NAME_INTEGER_VALUE));
406
+
407
+ n++;
408
+
409
+ }while(c.moveToNext());
410
+
411
+ }else{
412
+
413
+ //レコードが存在しない場合の処理
414
+
415
+ }
416
+
417
+
418
+
419
+
420
+
421
+ DB.close();
422
+
423
+
424
+
425
+ return values;
426
+
427
+ }catch(SQLiteException e){
428
+
429
+ //異常終了
430
+
431
+ Toast.makeText(activity, "データ取得に失敗しました", Toast.LENGTH_SHORT).show();
432
+
433
+ return null;
434
+
435
+ }
436
+
437
+
438
+
439
+ }
440
+
441
+
442
+
443
+ /**
444
+
445
+ * データベースへデータを保存
446
+
447
+ */
448
+
449
+ protected static void store(Activity activity, int[] values){
450
+
451
+ mySQLiteOpenHelper = new MySQLiteOpenHelper(activity.getApplicationContext());
452
+
453
+ try{
454
+
455
+ //データベースを書き込み可能で開く
456
+
457
+ DB = mySQLiteOpenHelper.getWritableDatabase();
458
+
459
+
460
+
461
+ //INTEGERテーブルに値を保存
462
+
463
+ for(int i=0;i<values.length;i++){
464
+
465
+ DB.execSQL("UPDATE " + TABLE_NAME_INTEGER + " "
466
+
467
+ + "SET " + COLUMN_NAME_INTEGER_VALUE + "=" + values[i] + " "
468
+
469
+ + "WHERE " + COLUMN_NAME_ID + "=" + String.valueOf(i+1));
470
+
471
+ }
472
+
473
+
474
+
475
+ DB.close();
476
+
477
+ }catch(SQLiteException e) {
478
+
479
+ //異常終了
480
+
481
+ //ここも引っかかる(トーストが出る)********************
482
+
483
+ Toast.makeText(activity, "保存に失敗しました", Toast.LENGTH_SHORT).show();
484
+
485
+ return;
486
+
487
+ }
488
+
489
+ }
490
+
491
+ }
26
492
 
27
493
  ```
28
494
 

2

2017/10/22 11:21

投稿

rinchu_17
rinchu_17

スコア24

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- (このサイトの質問も初めてでして質問フォーム使い方もよくわらないのでソースコードはご指摘いただいてから記載したいと思います)
17
+ (ソースコードすが部分を載せるべき判断しかねましたのでご指摘いただいてから記載したいと思います)
18
18
 
19
19
 
20
20
 

1

2017/10/21 22:52

投稿

rinchu_17
rinchu_17

スコア24

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- 自分では経験・知識ともに浅く、また調べても同じようなケースが見当たらないため、教えて頂きたいです。よろしくお願いします。
13
+ 自分では経験・知識ともに浅く、また調べても同じようなケースが見当たらないため、原因や解決方法を教えて頂きたいです。よろしくお願いします。
14
14
 
15
15
 
16
16