0

アプリのアップデート後、インターネットからの追加データでデータベースを一意に埋める必要があります。この目的のために、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>
4

1 に答える 1

2

アプリがクラッシュすることも、サービスが開始されない理由がLogCatにあることもありません。

信じがたいことですが、これに関連する警告(必ずしもエラーではない)があることは間違いありません。

のようなAndroidコンポーネントはService、通常の内部クラスにすることはできません。Androidにはインスタンスを作成する方法がないためです。あなたはインナークラスOnUpgradeServiceである必要があります。static

次に、その変更を行うと、マニフェストエントリが間違っていますOnUpgradeService。これは、内部クラスではないと主張しているためです。

両方の問題を解決する最も簡単な方法はOnUpgradeService、独自のファイルで通常のトップレベルのパブリックJavaクラスに移行することです。

そうは言っても、あなたの与えられたアプローチが長期にわたってうまく機能することがわかったら、私はかなり驚かれることでしょう。インターネットからデータベースにデータを入力するようなものを自分のやり方で埋めると、多くの問題が発生するようです。現状では、データベースにデータを入力するように求められる時期は比較的予測できません。これは、誰かがこれContentProviderに対して何らかの操作を実行しようとするたびに発生するためであり、適切なタイミングではない可能性があります。また、データの入力が行われていないのに、ユーザーがすぐに何を見るかという問題もあります。データベーススキーマの変更が発生するたびに発生する副作用であると考えるのではなく、データ同期モデルについてもっと真剣に考えることを強くお勧めします。

于 2013-01-01T01:30:15.647 に答える