android内容提供程序 - 首先运行Activity Splash屏幕,同时从原始数据填充内容提供程序中的数据库

时间:2012-09-01 18:00:18

标签: android

在我的应用程序中,我有一个内容提供程序,它使用数据库提供的内容。在第一次创建数据库时,需要从Json文件的原始内容中填充数据库。我的想法是,我在我的SQLiteOpenHelper子类的onCreate上触发了数据库的填充。这工作正常但我不知道如何在应用程序第一次运行时处理应用程序和内容提供程序之间的通信。基本上我想在数据库填充时显示某种启动画面。然而,如何通知应用程序

  1. 内容提供商在第一次运行时正忙于填充数据库
  2. 内容提供商已准备就绪
  3. 当然,我可以通过使用每个数据集调用内容提供程序来填充应用程序中的数据库,但我更愿意在内容提供程序的范围内进行,以便应用程序不必处理读取json文件等。除了设计偏好之外,它还使内容提供商能够更有效地填充数据库,因为它将同时拥有整个数据集。我有一种感觉,这是不可能的,但我希望我能错过一些简单的观点。

    如何实现这一目标的任何建议都将受到高度赞赏。

    由于

    马丁

1 个答案:

答案 0 :(得分:0)

使用内容提供程序时,我会假设您使用DBHelper类来管理数据库的创建。下面是android notes示例项目中的代码。

这显示了DBHelper构造函数如何足够智能以确定之前是否已创建数据库。在createDatabase方法中,我随后将调用一个方法来预填充数据库,就像你说的json文件一样。

问题是,这实际上并不允许您与Activity通信您的数据库尚未初始化。

有人认为您可以使用SharedPreferences来存储您填充数据库的事实。然后,您可以在启动时检查活动中的sharedPreference,调用内容提供程序以填充数据库,然后将共享首选项存储在您已完成此任务的位置。

请注意,如果您例如从android设置菜单中删除数据,我不确定sharedPreferences是否保持与数据库相同的状态。你需要检查一下。

  

http://code.google.com/p/android-notes/source/browse/trunk/src/com/bitsetters/android/notes/DBHelper.java?r=10

public class DBHelper {

private static final String DATABASE_NAME = "notes";
private static final String TABLE_DBVERSION = "dbversion";
private static final String TABLE_NOTES = "notes";
private static final int DATABASE_VERSION = 1;
private static String TAG = "DBHelper";
Context myCtx;

private static final String DBVERSION_CREATE = 
    "create table " + TABLE_DBVERSION + " ("
            + "version integer not null);";

private static final String NOTES_CREATE =
    "create table " + TABLE_NOTES + " ("
        + "id integer primary key autoincrement, "
        + "note text, "
        + "lastedit text);";

private static final String NOTES_DROP =
    "drop table " + TABLE_NOTES + ";";

private SQLiteDatabase db;
/**
 * 
 * @param ctx
 */
public DBHelper(Context ctx) {
    myCtx = ctx;
            try {
                    db = myCtx.openOrCreateDatabase(DATABASE_NAME, 0,null);

                    // Check for the existence of the DBVERSION table
                    // If it doesn't exist than create the overall data,
                    // otherwise double check the version
                    Cursor c =
                            db.query("sqlite_master", new String[] { "name" },
                                            "type='table' and name='"+TABLE_DBVERSION+"'", null, null, null, null);
                    int numRows = c.getCount();
                    if (numRows < 1) {
                            CreateDatabase(db);
                    } else {
                            int version=0;
                            Cursor vc = db.query(true, TABLE_DBVERSION, new String[] {"version"},
                                            null, null, null, null, null,null);
                            if(vc.getCount() > 0) {
                                vc.moveToFirst();
                                version=vc.getInt(0);
                            }
                            vc.close();
                            if (version!=DATABASE_VERSION) {
                                    Log.e(TAG,"database version mismatch");
                            }
                    }
                    c.close();


            } catch (SQLException e) {
                    Log.d(TAG,"SQLite exception: " + e.getLocalizedMessage());
            } finally {
                    db.close();
            }
}

private void CreateDatabase(SQLiteDatabase db)
{
            try {
                    db.execSQL(DBVERSION_CREATE);
                    ContentValues args = new ContentValues();
                    args.put("version", DATABASE_VERSION);
                    db.insert(TABLE_DBVERSION, null, args);

                    db.execSQL(NOTES_CREATE);
                    // Populate with data
                    populateDataBaseFromFile();// There are probably better ways to do this.
                    setSharedPreferenceYouPopulatedDB();
            } catch (SQLException e) {
                    Log.d(TAG,"SQLite exception: " + e.getLocalizedMessage());
            } 
}

除非你真的需要,否则我个人不会对启动画面感到困扰。

另一个想法可能是:

  1. 在db helper中写入一个方法来确定表是否存在。如果没有,则返回false。
  2. 在启动活动中,使用调用DBHelper测试方法的请求调用ContentProvider。
  3. 如果为false,则显示启动画面,然后调用Content Provider填充数据库。
  4. 如果是,则继续正常进行。