in 未分類

androidアプリでバージョンをあげたらSQLでエラー

奇妙なエラーにハマったのでメモ代わりに書いておきます。
まず、問題について

androidでアプリのバージョンアップを行いました。
その時今までアクセスできていたSQLのDBのファイルにアクセス出来ないとエラー文が。

I/SqliteDatabaseCpp(17088): sqlite returned: error code = 14, msg = cannot open file at line 27699 of [8609a15dfa], db=データベースのファイルの場所
I/SqliteDatabaseCpp(17088): sqlite returned: error code = 14, msg = os_unix.c: open() at line 27699 - "" errno=13 path=データベースのファイルの場所,db=データベースのファイルの場所
E/SqliteDatabaseCpp(17088): sqlite3_open_v2("データベースのファイルの場所", &handle, 6, NULL) failed
E/SQLiteDatabase(17088): Failed to open the database. closing it.
E/SQLiteDatabase(17088): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
E/SQLiteDatabase(17088):        at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/SQLiteDatabase(17088):        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013)
E/SQLiteDatabase(17088):        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
E/SQLiteDatabase(17088):        at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
E/SQLiteDatabase(17088):        at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:802)
E/SQLiteDatabase(17088):        at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
E/SQLiteDatabase(17088):        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
E/SQLiteDatabase(17088):        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)

(省略)

普通こんなエラーにならないし、DBにアクセス出来ないとか聞いたことなかった。
sqlite returned: error code = 14が気になったので調べてみても英語だらけで回答もないしどうしたものかと悩んだ。

で、原因を考えてみて問題点は発見しました。
このアプリでは別のAPKのファイルにアクセスできるようにするためandroid:sharedUserIdを新しく設定していました。
androidではこのIDが設定されたアプリの実行権限を同じユーザに設定してアプリごとの保存領域などにそれぞれアクセスできるようになっています。
で、これが設定されてない場合は適当に実行権限のユーザをふられるようになっています。
問題はこれでした。
以前はandroid:sharedUserIdなんて設定していませんでした。
でアップデートしたAPKではこれを設定しました。
これによってユーザが変わってしまい、ファイルへのアクセス権がなくなってしまったのです。
つまりandroid:sharedUserIdを設定するとDBへのアクセス権が失われることに・・・。
ご注意を。

ついでに実際にユーザが変わったか確認してみました。

最初、android:sharedUserIdを設定していない状態でPSコマンドを使用してアプリに振られたユーザを調べます。

するとこんな感じに
app_57 17367 134 474380 28172 ffffffff 40041410 S com.suruyatu
でandroid:sharedUserIdを設定したAPKにアップデートすると
app_84 17543 134 450276 23964 ffffffff 400406c0 S com.suruyatu

に変わってしまいました。

ここでUserのapp_57からapp_84に変わってしまったことに問題があるわけです。
これが変わってしまうことでファイルへのアクセス権がなくなりDBにアクセスできなくなるわけです。

でどうやって対処したらいいのかですが・・・。
現実的な方法が思いつきません。
一番いい方法としてはandroid:sharedUserIdをつける1個まえのアップデートでDBのデータをSDなどにアクセス権をつけて保存しておき
android:sharedUserIdを設定したアップデートでデータベースのファイルの場所に戻してアクセス権を戻すくらいしか思いつきませんでした。
しかし、これでは以前からアップデートしていない人がアップデートすると結局同じことになるとおもいます。またDBをSDなど他のアプリからアクセス出来る場所に置くとセキュリティー的にまずい気がします。

自分はこの辺が現実的はないと判断し、ユーザに再インストールしてもらうようにしましたが、一部の方々はおそらくアンインストールしてしまったとおもいます。

これの対応策があれば是非教えていただきたい。


One Comment

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image