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を外してしまいました.
    例:
    //         
      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
                          }
    
    以上です.