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 组件,如 a Service,不能是普通的内部类,因为 Android 无法创建实例。你OnUpgradeService需要成为一个static内部类。

然后,如果您进行更改,则您的清单条目是错误的,因为它声称这OnUpgradeService不是任何事物的内部类。

解决这两个问题的最简单方法是OnUpgradeService在其自己的文件中转换为常规的顶级公共 Java 类。

说了这么多,如果你发现你给定的方法长期有效,我会感到相当惊讶。以你的方式从互联网上填充数据库之类的东西似乎会给你带来很多问题。就目前而言,当您被要求填充数据库时,它是相对不可预测的,因为每当有人尝试对 this 执行某些操作时都会如此ContentProvider,这可能不是一个合适的时机。此外,还有一个问题是用户将立即看到什么,而数据填充还没有发生。我强烈建议您更认真地考虑您的数据同步模型,而不是将其视为随时发生的数据库模式更改的一些副作用。

于 2013-01-01T01:30:15.647 回答