java - On Upgrade 方法被调用但数据未加载
问题描述
我的第一个活动 ( MainActivity
) 有不同的字母(如 A、B、C ...)。当单击一个字母时,它会打开一个新活动 ( LIstViewActivity
),其中包含listView
以该字母开头的单词。该列表是从文件raw
夹内的文本文件创建的,并存储在一个database
命名的假设database_a
中。在LIstViewActivity
我存储的boolean
其中SharedPreferences
检查是否database
创建了该特定字母。如果未创建,则运行该initializeDatabase
方法,否则不运行。这些工作正常。但是如果我增加database version
thenonUpgrade
方法被调用但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();
}
}
解决方案
推荐阅读
- python - 使用 Selenium,在 Chrome 中启用“弹出窗口和重定向”
- python - 如果输入文本框包含部分单词,则填写输入文本框
- assembly - Dword 转换为 little endian 中的 dec
- python - 在 Python 中使用乘法运算符进行矩阵乘法:如何?
- regex - 在正则表达式中搜索字母数字密码
- javascript - Input problems in javascript
- digital-signature - 已签名 RPM 的数字签名存储在哪里?
- azure-devops - 使用 oAuth 访问 Azure DevOps REST API
- scala - Docker linux 容器未观察 Window 主机所做的文件更改
- mysql - 有什么方法可以使用 JOIN 正确替换条件子查询并优化这些类型查询?