когда LauncherProvider.DatabaseHelper.convertDatabase (SQLiteDatabase db) вернет true в программе запуска Android по умолчанию? - PullRequest
3 голосов
/ 21 февраля 2012

Я сталкиваюсь с проблемой, когда читаю исходный код Launcher по умолчанию для 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?Моя версия Android 2.2

1 Ответ

1 голос
/ 21 мая 2012

Некоторый контекст можно получить из сообщений журнала:

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

Если база данных была в старом формате, convertDatabase() копирует все записи в новую, используя copyFromCursor, где курсор указывает на старый экземпляр, а затем удаляет его. Таким образом, метод вернет true, если он найдет и преобразует экземпляр базы данных в старом формате, а false в противном случае.

Поскольку на самом деле средство запуска называется Launcher2, скорее всего, оно пытается найти следы предшественника.

...