アプリのアップデート後、インターネットからの追加データでデータベースを一意に埋める必要があります。この目的のために、OnUpgradeService()というサービスを実装しました。このサービスは、SQLiteOpenHelperのOnUpgrade()メソッドで開始する必要があります。
startServiceが実行されているのに、onStartCommand()が呼び出されていないことがわかります。
public class MyContentProvider extends ContentProvider {
...
private static class MyOpenHelper extends SQLiteOpenHelper {
...
public MyOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
...
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1) {
db.execSQL(DATABASE_CREATE_THUMBNAIL);
db.execSQL("alter table " + DATABASE_TABLE_FRIEND + " add column " + KEY_THUMBNAIL_URI + " text;");
...
Intent intent = new Intent(context, OnUpgradeService.class);
context.startService(intent);
}
else {
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_FRIEND);
onCreate(db);
}
}
...
public class OnUpgradeService extends Service {
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Thread t = new Thread(new Runnable() {
public void run() {
upgradeDatabase();
stopSelf();
}
});
t.start();
return Service.START_REDELIVER_INTENT;
}
マニフェストの関連エントリは次のようになります。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
...
<application>
...
<service android:enabled="true" android:name=".OnUpgradeService" />
...
</application>
...
</manifest>