【问题标题】:when LauncherProvider.DatabaseHelper.convertDatabase(SQLiteDatabase db) return true in Android default Launcher?当 LauncherProvider.DatabaseHelper.convertDatabase(SQLiteDatabase db) 在 Android 默认启动器中返回 true 时?
【发布时间】:2012-02-21 09:00:45
【问题描述】:

在阅读Android 2.2默认启动器的源代码时遇到一个问题。
LauncherProvider.DatabaseHelper的源码段:

@Override
public void onCreate(SQLiteDatabase db) {
    if (LOGD)
    Log.d(TAG, "creating new launcher database");

    db.execSQL("CREATE TABLE favorites (" + "_id INTEGER PRIMARY KEY,"
        + "title TEXT," + "intent TEXT," + "container INTEGER,"
        + "screen INTEGER," + "cellX INTEGER," + "cellY INTEGER,"
        + "spanX INTEGER," + "spanY INTEGER," + "itemType INTEGER,"
        + "appWidgetId INTEGER NOT NULL DEFAULT -1,"
        + "isShortcut INTEGER," + "iconType INTEGER,"
        + "iconPackage TEXT," + "iconResource TEXT," + "icon BLOB,"
        + "uri TEXT," + "displayMode INTEGER" + ");");

    // Database was just created, so wipe any previous widgets
    if (mAppWidgetHost != null) {
    mAppWidgetHost.deleteHost();
    sendAppWidgetResetNotify();
    }

    if (!convertDatabase(db)) {
    // Populate favorites table with initial favorites
    loadFavorites(db);
    }
}

private boolean convertDatabase(SQLiteDatabase db) {
    if (LOGD)
    Log.d(TAG,
        "converting database from an older format, but not onUpgrade");
    boolean converted = false;

    final Uri uri = Uri.parse("content://" + Settings.AUTHORITY
        + "/old_favorites?notify=true");
    final ContentResolver resolver = mContext.getContentResolver();
    Cursor cursor = null;

    try {
    cursor = resolver.query(uri, null, null, null, null);
    } catch (Exception e) {
    // Ignore
    }

    // We already have a favorites database in the old provider
    if (cursor != null && cursor.getCount() > 0) {
    try {
        converted = copyFromCursor(db, cursor) > 0;
    } finally {
        cursor.close();
    }

    if (converted) {
        resolver.delete(uri, null, null);
    }
    }

    if (converted) {
    // Convert widgets from this import into widgets
    if (LOGD)
        Log.d(TAG, "converted and now triggering widget upgrade");
    convertWidgets(db);
    }

    return converted;
}

onCreate()在系统没有数据库时调用创建数据库。在 onCreate() 的尾部,它调用 convertDatabase(SQLiteDatabase db)。 convertDatabase(SQLiteDatabase db)中有查询代码。我很困惑。为什么它在 onCreate() 中查询? convertDatabase(SQLiteDatabase db) 什么时候返回 true?我的安卓版本是2.2

【问题讨论】:

    标签: android launcher


    【解决方案1】:

    可以从日志消息中检索一些上下文:

    if (LOGD) Log.d(TAG, "converting database from an older format, but not onUpgrade");
    

    如果有一个旧格式的数据库,convertDatabase() 使用 copyFromCursor 将所有条目复制到新的,其中光标指向旧实例,然后将其删除。因此,如果该方法找到并转换了旧格式的数据库实例,则该方法将返回true,否则返回false

    由于启动器实际上调用了Launcher2,它很可能会尝试寻找前任的踪迹。

    【讨论】:

    • 感谢您的回答。这是否意味着旧的启动器与Launcher2具有相同的权限和不同的数据库文件名?
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 2012-08-31
    • 2013-11-14
    相关资源
    最近更新 更多