写入数据库的服务和活动从中读取

时间:2016-05-03 13:39:30

标签: android sqlite android-contentprovider loader

需要架构帮助。我正在构建一个由ServiceActivity组成的应用。 Service会将数据写入SQLite数据库,而Activity应将数据读取并显示。有两个问题:1)Activity应该即时收到更新。 2)如果Activity变为背景,它应该在返回前景时加载所有更改。

经过两天的研究,我认为实现它的唯一方法是创建ContentProvider作为中间层并在Activity中使用CursorLoader。我对吗?还有其他建议吗?任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

另一种方法是制作自己的观察者模式实现。这是我的版本:

观察员

/**
 * Receives notification of updates on database contents.
 */
public interface DatabaseObserver {
    /**
     * This method is called if the observable database's notifyObservers 
     * method is called (because the observable database has been updated.
     */
    void onUpdate(String tableName);
}

可观察

/**
 * Used to notify a group of Observer objects when a change occurs.
 */
public interface ObservableDatabase {
    /**
     * Adds the specified observer to the list of observers.
     */
    void addObserver(DatabaseObserver observer);

    /**
     * Removes the specified observer from the list of observers.
     */
    void removeObserver(DatabaseObserver observer);
}

数据库助手

public class DatabaseHelper extends SQLiteOpenHelper implements ObservableDatabase {
    private static DatabaseHelper sInstance;

    private CopyOnWriteArrayList<DatabaseObserver> mObservers = new CopyOnWriteArrayList<>();

    /**
     * Returns the single instance of Database helper
     */
    public static synchronized DatabaseHelper getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new DatabaseHelper(context.getApplicationContext());
        }

        return sInstance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_STATEMENT);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_STATEMENT);
        onCreate(db);
    }

    /**
     * Adds the specified observer to the list of observers.
     */
    public void addObserver(DatabaseObserver observer) {
        mObservers.addIfAbsent(observer);
    }

    /**
     * Removes the specified observer from the list of observers.
     */
    public void removeObserver(DatabaseObserver observer) {
        mObservers.remove(observer);
    }

    private DatabaseHelper(Context context) {
        super(context, DB_NAME, null, BuildConfig.VERSION_CODE);
    }

    private void notifyObservers(String tableName) {
        for (DatabaseObserver observer: mObservers) {
            observer.onUpdate(tableName);
        }
    }
}

请注意,数据库帮助程序中的每个编写方法都应在修改数据库后调用notifyObservers(tableName)。

现在,任何组件都可以订阅此数据库助手以进行更新。在尝试更新UI之前,请确保onUpdate回调中的活动没有死亡。