回答編集履歴
5
誤記修正
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
追記
|
28
28
|
|
29
|
-
ご提示いただいたコードを確認させてもらいました。このコードが全部ではないと言うことでしたが、少なくとも2点、問題
|
29
|
+
ご提示いただいたコードを確認させてもらいました。このコードが全部ではないと言うことでしたが、少なくとも2点、問題を見つけましたので追記します。MySQLiteOpenHelper 内で生成しているSQLに問題があります。
|
30
30
|
|
31
31
|
|
32
32
|
|
4
誤記修正。
test
CHANGED
@@ -82,11 +82,11 @@
|
|
82
82
|
|
83
83
|
ご提示のコードでは上記のように途中でExceptionが発生し、完了しないのでテーブルが完成していません。
|
84
84
|
|
85
|
-
ただ、上の指摘は
|
85
|
+
ただ、上の指摘はSQLの問題なので、データベースファイル自体は`getReadableDatabase`を呼び出した時点で作成されるはずです。その後、`SQLiteOpenHelper.onCreate`が呼ばれるはずですので、ブレークポイントを張って確認してみてください。尚、既にファイルがあれば`SQLiteOpenHelper.onCreate`は呼ばれません。
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
ファイルはadb shellで確認できるのですが、実機を使っているとユーザーのパーミッションの関係で実行が失敗するかもしれません。以下はAndroidエミュレーター
|
89
|
+
ファイルはadb shellで確認できるのですが、実機を使っているとユーザーのパーミッションの関係で実行が失敗するかもしれません。以下はmacOS上のAndroidエミュレーターを相手として実行した結果です。myregister.dbファイルがあることが分かります。
|
90
90
|
|
91
91
|
```Bash
|
92
92
|
|
@@ -96,6 +96,6 @@
|
|
96
96
|
|
97
97
|
-rw------- u0_a57 u0_a57 8720 2017-10-23 04:23 myregister.db-journal
|
98
98
|
|
99
|
+
```
|
99
100
|
|
100
|
-
|
101
|
-
|
101
|
+
Test27と言うアプリ名、packageが examples.products で確認用アプリを作ったのでこのようなPATHになっています。
|
3
コード提示に伴い、動作確認して追記しました。
test
CHANGED
@@ -19,3 +19,83 @@
|
|
19
19
|
|
20
20
|
|
21
21
|
「本体を再起動させれば」と書いたのは念の為で、データベースを作るコードがどこにあるか、Activityの`onCreate`にある場合や`onResume`など、Activityのライフサイクルに関わるメソッドで変わってくるからです。`onCreate`上にあると、操作の流れによって呼び出されないことがあります。このあたりは「Android Activity ライフサイクル」などで検索して確認してみてください。
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
---
|
26
|
+
|
27
|
+
追記
|
28
|
+
|
29
|
+
ご提示いただいたコードを確認させてもらいました。このコードが全部ではないと言うことでしたが、少なくとも2点、問題がありましたので追記します。MySQLOpenHelper 内で生成しているSQLに問題があります。
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
1つ目、2つのカラムにプライマリキー指定がされているので、CREATE文の実行でエラー(Exception)になります。
|
34
|
+
|
35
|
+
```Java
|
36
|
+
|
37
|
+
//整数用テーブル作成
|
38
|
+
|
39
|
+
db.execSQL("CREATE TABLE " + TABLE_NAME_INTEGER + " ("
|
40
|
+
|
41
|
+
+ COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
|
42
|
+
|
43
|
+
+ COLUMN_NAME_INTEGER_NOMINAL + "TEXT PRIMARY KEY NOT NULL"
|
44
|
+
|
45
|
+
+ COLUMN_NAME_INTEGER_VALUE + " INTEGER)");
|
46
|
+
|
47
|
+
```
|
48
|
+
|
49
|
+
```
|
50
|
+
|
51
|
+
# Exceptionの内容
|
52
|
+
|
53
|
+
android.database.sqlite.SQLiteException: table "integer_table" has more than one primary key (code 1): , while compiling: CREATE TABLE integer_table (_id INTEGER PRIMARY KEY AUTOINCREMENT,nominalTEXT PRIMARY KEY NOT NULLvalue INTEGER)
|
54
|
+
|
55
|
+
```
|
56
|
+
|
57
|
+
2つ目、INSERT文のSQLにも問題があり、正しくカラム名が指定できてません。
|
58
|
+
|
59
|
+
```Java
|
60
|
+
|
61
|
+
db.execSQL("INSERT INTO " + TABLE_NAME_INTEGER + " VALUES("
|
62
|
+
|
63
|
+
+ RECORD_NAME_SALESAMOUNT + ",0)");
|
64
|
+
|
65
|
+
```
|
66
|
+
|
67
|
+
```
|
68
|
+
|
69
|
+
# Exceptionの内容
|
70
|
+
|
71
|
+
android.database.sqlite.SQLiteException: no such column: salesAmount (code 1): , while compiling: INSERT INTO integer_table VALUES(salesAmount,0)
|
72
|
+
|
73
|
+
```
|
74
|
+
|
75
|
+
ひとつの例ですが、以下のようなSQLにしてカラムを指定し、完成させる必要があるかと思います。
|
76
|
+
|
77
|
+
```SQL
|
78
|
+
|
79
|
+
INSERT INTO integer_table(nominal,value) VALUES ('salesAmount',0)
|
80
|
+
|
81
|
+
```
|
82
|
+
|
83
|
+
ご提示のコードでは上記のように途中でExceptionが発生し、完了しないのでテーブルが完成していません。
|
84
|
+
|
85
|
+
ただ、上の指摘はCREATE文の問題なので、データベースファイル自体は`getReadableDatabase`を呼び出した時点で作成されるはずです。その後、`SQLiteOpenHelper.onCreate`が呼ばれるはずですので、ブレークポイントを張って確認してみてください。尚、既にファイルがあれば`SQLiteOpenHelper.onCreate`は呼ばれません。
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
ファイルはadb shellで確認できるのですが、実機を使っているとユーザーのパーミッションの関係で実行が失敗するかもしれません。以下はAndroidエミュレーターで実行した結果です。myregister.dbファイルがあることが分かります。す。Test27と言うアプリ名、packageが examples.products で確認用アプリを作ったのでこのようになPATHになっていま
|
90
|
+
|
91
|
+
```Bash
|
92
|
+
|
93
|
+
bash-3.2$ adb shell ls -l /data/data/examples.products.test27/databases/
|
94
|
+
|
95
|
+
-rw-rw---- u0_a57 u0_a57 24576 2017-10-23 04:23 myregister.db
|
96
|
+
|
97
|
+
-rw------- u0_a57 u0_a57 8720 2017-10-23 04:23 myregister.db-journal
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
```
|
2
誤記修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
例えば自アプリが「Sample」で、パッケージが「products.examples」、データベースファイル名が「sample.db」であれば、ファイルは
|
8
8
|
|
9
|
-
/data/data/examples.products.
|
9
|
+
/data/data/examples.products.sample/databases/sample.db
|
10
10
|
|
11
11
|
として作成されます。これを本体の「設定」でアプリデータの消去をするとdatabases/sample.dbが削除されてしまうので、開けなくなります。
|
12
12
|
|
1
改行位置修正、追記。
test
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
こんにちは。
|
2
2
|
|
3
|
-
開けなくなるのが正常な動作ですので大丈夫です。SQLiteのデータベースを作ると、
|
3
|
+
開けなくなるのが正常な動作ですので大丈夫です。SQLiteのデータベースを作ると、データベースのファイルは自アプリで読み書きできるディレクトリ下に作成されます。
|
4
|
-
|
5
|
-
データベースのファイルは自アプリで読み書きできるディレクトリ下に作成されます。
|
6
4
|
|
7
5
|
|
8
6
|
|
@@ -12,9 +10,7 @@
|
|
12
10
|
|
13
11
|
として作成されます。これを本体の「設定」でアプリデータの消去をするとdatabases/sample.dbが削除されてしまうので、開けなくなります。
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
(ファイルの位置はAndroid Device Monitorやadb shellで確認することもできます)
|
13
|
+
(ファイルの位置はAndroid Device Monitorや、場合にもよりますがadb shellでシェル上で確認することもできます)
|
18
14
|
|
19
15
|
|
20
16
|
|
@@ -22,4 +18,4 @@
|
|
22
18
|
|
23
19
|
|
24
20
|
|
25
|
-
「本体を再起動させれば」と書いたのは念の為で、データベースを作るコードがActivityの`onCreate`にある場合や`onResume`など、Activityのライフサイクルに関わるメソッドで変わってくるからです。このあたりは「Android Activity ライフサイクル」などで検索して確認してみてください。
|
21
|
+
「本体を再起動させれば」と書いたのは念の為で、データベースを作るコードがどこにあるか、Activityの`onCreate`にある場合や`onResume`など、Activityのライフサイクルに関わるメソッドで変わってくるからです。`onCreate`上にあると、操作の流れによって呼び出されないことがあります。このあたりは「Android Activity ライフサイクル」などで検索して確認してみてください。
|