首页 > 解决方案 > On Upgrade 方法被调用但数据未加载

问题描述

我的第一个活动 ( MainActivity) 有不同的字母(如 A、B、C ...)。当单击一个字母时,它会打开一个新活动 ( LIstViewActivity),其中包含listView以该字母开头的单词。该列表是从文件raw夹内的文本文件创建的,并存储在一个database命名的假设database_a中。在LIstViewActivity我存储的boolean其中SharedPreferences检查是否database创建了该特定字母。如果未创建,则运行该initializeDatabase方法,否则不运行。这些工作正常。但是如果我增加database versionthenonUpgrade方法被调用但list没有填充。我也尝试改变boolean里面的值onUpgrade方法。在这种情况下,我第一次尝试时没有填充数据,当我返回并再次访问时,数据正在加载。我认为问题可能是由于boolean价值。我怎样才能克服这个问题?任何帮助将不胜感激。谢谢...

onCreate这是里面ListViewActivity

 //initialize key for the boolean in sharedPreference
    INITIALIZED = "initialized_database_"+class_name;

    //initialize sharedPreference to avoid NullPointerException
    sharedPreferences = getSharedPreferences(INITIALIZED, MODE_PRIVATE);

    myDictionaryDatabaseHelper = new DictionaryDatabaseHelper(this, db_name);
    allWordDefinitions = new ArrayList<>();

    initialized = sharedPreferences.getBoolean(INITIALIZED, false);

    //initialize database
    if (!initialized) {

        //initialize database
        initializeDatabase();
    }
    else {
        //Log.e(logTagString, myDictionaryDatabaseHelper.getDatabaseName() +" already initialized.");
    }

这是initializeDatabase方法

//initialize the database
private void initializeDatabase() {

    editor = sharedPreferences.edit();

    try {
        InputStream inputStream = getResources().openRawResource(db_resource);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        DictionaryLoader.loadData(bufferedReader, myDictionaryDatabaseHelper);

        Toast.makeText(this, "Initializing database...", Toast.LENGTH_SHORT).show();
        //Log.e(logTagString, "Initializing " + myDictionaryDatabaseHelper.getDatabaseName());

        //change boolean value in sharedPreference editor
        editor.putBoolean(INITIALIZED, true);
        editor.apply();
    } catch (Resources.NotFoundException e) {
        e.printStackTrace();
        //Log.e(logTagString, myDictionaryDatabaseHelper.getDatabaseName() +" resource not found!");
        //Log.e(logTagString, myDictionaryDatabaseHelper.getDatabaseName() +" initialization failed!");

        //toast a message
        Toast.makeText(this, "Database resource not found!", Toast.LENGTH_SHORT).show();
        Toast.makeText(this, "Database initialization failed!", Toast.LENGTH_SHORT).show();

        //keep the initialized boolean false to reinitialize the database
        editor.putBoolean(INITIALIZED, false);
        editor.apply();
    }
}

这是我的DictionaryDatabaseHelper

class DictionaryDatabaseHelper extends SQLiteOpenHelper {

private static String DB_NAME = "db_name";
private final static int DB_VERSION = 2;


private final static String ID_COLUMN = "_id";
private final static String WORD_COLUMN = "word";
private final static String DEFINITION_COLUMN = "definition";

private final String CREATE_DATABASE_QUERY = "CREATE TABLE "
        +getDatabaseName()+ " ("
        +ID_COLUMN+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
        +WORD_COLUMN+ " TEXT, "
        +DEFINITION_COLUMN+ " TEXT)";

private final String UPGRADE_QUERY = "DROP TABLE IF EXISTS " +getDatabaseName();

//constructor to create different named database
DictionaryDatabaseHelper(Context context, String db_name) {
    super(context, db_name, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_DATABASE_QUERY);
    //Log.e("DICTIONARY", "DatabaseHelper onCreate Initializing database...");
    //Log.e("DICTIONARY", "Database name is: " +getDatabaseName());
    //Log.e("DICTIONARY", "Database version is "+db.getVersion());
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //make the database initialization variable false to reinitialize the database
    WordListActivity.editor.putBoolean(WordListActivity.INITIALIZED, false);
    WordListActivity.editor.apply();
    //Log.e("DICTIONARY", "Initialized value is: " +WordListActivity.initialized);



    db.execSQL(UPGRADE_QUERY);
    onCreate(db);

    //Log.e("DICTIONARY", "Upgrading database form version " +oldVersion+ " to " +newVersion);
}

//Initialize database for the first time
void initializeDatabaseForTheFirstTime(ArrayList<WordDefinition> wordDefinitions) {

    //Log.e("DICTIONARY", "Initializing database for the first time.");

    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("BEGIN");

    ContentValues contentValues = new ContentValues();

    for (WordDefinition wordDefinition : wordDefinitions) {
        contentValues.put(WORD_COLUMN, wordDefinition.word);
        contentValues.put(DEFINITION_COLUMN, wordDefinition.definition);

        db.insert(getDatabaseName(), null, contentValues);
    }

    db.execSQL("COMMIT");
    db.close();
}

}

标签: javaandroiddatabasesqliteopenhelper

解决方案


推荐阅读