AndroidではGreen Daoのピットを使って整理します.
AndroidではGreen Daoのピットを使って整理します.、Green Daoレベルアップ (1)レベルアップでDao()を使ってテーブルを作成した後、データベースの操作に失敗しました.
1,グリーンDaoアップグレードピット
(1)アップグレードでDao()を使ってテーブルを作成してデータベースの操作に失敗しました.
シーン:あるバージョンのアップグレードで、GreenDaoが持参したDao.reate Tableを使ってテーブルを新規作成します.また、現在のバージョンまたは後続のバージョンで該当テーブルのデータ移動をしたり、他のsql文で書かれた操作をしたりすると、エラーが発生しやすくなります.
エラーの原因は通常sql文try-catchに登録されます.そして、データベースはアプリ起動時にアップグレードされます.調整が難しいです.
この問題は次のバージョンで問題が発生したテーブルを列に増やしたら、前の表に最新の表を作成してsql文を操作します.しかし、sql文の中のフィールドはすべてのデータベースフィールドをカバーしていません(追加されました)ので、エラーでcatchを外してしまいました.
例:
解決方法:データベーステーブルを作成した後、テーブルをsql操作し、その後のバージョンがフィールドを追加すると.greendotが持参するデータベーステーブルを作成するdao.reate Tableを使ってはいけません.sql文を直接使用して表を作成します.このように作成したテーブルフィールドは現在のバージョンのフィールド数と一致しています.エラーが発生しないようにします.
sql作成の表現例は以下の通りです.
1,グリーンDaoアップグレードピット
(1)アップグレードでDao()を使ってテーブルを作成してデータベースの操作に失敗しました.
シーン:あるバージョンのアップグレードで、GreenDaoが持参したDao.reate Tableを使ってテーブルを新規作成します.また、現在のバージョンまたは後続のバージョンで該当テーブルのデータ移動をしたり、他のsql文で書かれた操作をしたりすると、エラーが発生しやすくなります.
エラーの原因は通常sql文try-catchに登録されます.そして、データベースはアプリ起動時にアップグレードされます.調整が難しいです.
この問題は次のバージョンで問題が発生したテーブルを列に増やしたら、前の表に最新の表を作成してsql文を操作します.しかし、sql文の中のフィールドはすべてのデータベースフィールドをカバーしていません(追加されました)ので、エラーでcatchを外してしまいました.
例:
//
case VERSION_32:
//
KeywordCustomRecordDao.createTable(db,true);
insertNotificationIntoKeywordCustomRecordData(db);
break;
//
private void insertNotificationIntoKeywordCustomRecordData(Database db) {
int customPriority = KeyWordAddFragment.KEY_KEYWORD_PROPERTY;
int i = 0;
Cursor cursor = db.rawQuery("SELECT * FROM NOTIFICATION_KEYWORD", null);
try {
if (cursor != null && cursor.moveToFirst()) {
do {
Long recordId = cursor.getLong(cursor.getColumnIndex("_id"));
String word = cursor.getString(cursor.getColumnIndex("WORD"));
Integer showType = cursor.getInt(cursor.getColumnIndex("SHOW_TYPE"));
Long timestamp = cursor.getLong(cursor.getColumnIndex("TIMESTAMP"));
String recordedSql = "INSERT INTO KEYWORD_CUSTOM_RECORD(_id,NAME,SHOW_TYPE,INCLUDE,EXCLUDE"
+ ",IS_EFFECT,IS_ALL_APP,NOTICE_SETTING,IS_FLOATING,IS_KEYWORD_HIGH,PRIORITY,TIMESTAMP"
+ ",SKY_RULE,SKY_BACKGROUND_URL,SKY_CONTENT,SKY_FLOAT_NOTIFICATION_URL,SKY_POPUP_TITLE"
+ ",SKY_POPUP_CONTENT)values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
db.execSQL(recordedSql, new Object[] {recordId, word, 1, word, "", true, true, showType, false, true,
(customPriority + (i++)), timestamp, "", "", "", "", "", ""});
} while (cursor.moveToNext());
}
} catch (Exception e) {
// do nothing
} finally {
if (cursor != null) {
cursor.close();
}
}
}
この操作では、execsql文の実行中にフィールドが見つからなくてエラーが発生します.解決方法:データベーステーブルを作成した後、テーブルをsql操作し、その後のバージョンがフィールドを追加すると.greendotが持参するデータベーステーブルを作成するdao.reate Tableを使ってはいけません.sql文を直接使用して表を作成します.このように作成したテーブルフィールドは現在のバージョンのフィールド数と一致しています.エラーが発生しないようにします.
sql作成の表現例は以下の通りです.
private void createCustomRecordTable(Database db, boolean ifNotExists) {
String constraint = ifNotExists ? "IF NOT EXISTS " : "";
db.execSQL("CREATE TABLE " + constraint + "\"KEYWORD_CUSTOM_RECORD\" (" + //
"\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id
"\"NAME\" TEXT," + // 1: name
"\"SHOW_TYPE\" INTEGER NOT NULL ," + // 2: showType
"\"INCLUDE\" TEXT," + // 3: include
"\"EXCLUDE\" TEXT," + // 4: exclude
}
以上です.