寫好重建表的sql語句,我這裡是將原表重新命名建立新錶,將資料匯入後刪除原表。也可以建立臨時表遷移資料後刪除臨時表。sql檔案放到assets下面,內容如下:
alter
table reform rename
to tempreform;
create
table reform
( reformid integer
, userid integer
, reformname text
, reformnumb text
, reformcontent text
, reformstatus text
, reformcount text
, reformstarttime text
, reformendtime text
, realexectime text
, createtime text
, reformresult text
, reformuserid integer
, reformusername text
, checkresultid integer
, inspareaid integer
, inspareaname text
, insppointnumb text
, taskid integer
, tasktype text
, checkitemid integer
, checkitemname text
, checkitemnumb text
, checkitemdesc text
, keypointid integer
, keypointname text
, keypointnumb text
, regtime text
, spotchecktime text
, spotcheckresult text
, spotcheckusername text
, rechecktime text
, recheckresult text
, recheckusername text
, organid integer
, organname text
, updatetime text
,primary
key(reformid, userid));
insert
into reform select
*from tempreform;
drop
table tempreform;
commit
;
聯合主鍵要一起寫在所有字段最後如primary key(reformid, userid),否則會不生效。
3. 增加新的類migration_13_reform(和資料庫版本號同步,我這裡是從12公升到13)繼承於com.raizlabs.android.dbflow.sql.migration包下的basemigration並重寫migrate()方法,記得開啟事務。
@migration
class
)public
static
class
migration_13_reform
extends
basemigration
}
最後附上assetsutils原始碼(網上搬運的):
public
final
class
assetsutils
/** * 從檔案中獲取字串
** @param filename
* @param context
* @return
*/public
static string getstring
(string filename, context context)
}catch
(ioexception e)
return stringbuilder.
tostring()
;}/** * 根據字串返回實體類
** @param filename
* @param context
* @param tclass
* @param 實體類
* @return
*/public
static
t getjsonobject
(string filename, context context, class
tclass)
}
我重寫的migrate方法在dbflow中被呼叫的地方已經開啟了事務,而我這裡不僅在sql裡面有個commit,還顯式使用database.begintransaction來開啟了事務,懷疑這裡會導致執行自己寫的sql語句失敗,並且原始碼中有trycatch懷疑執行sql出現異常**獲,但是由於某種原因未被列印出來,下面給出的dbflow執行migration的原始碼可以看到,這是basedatabasehelper類的executemigrations方法原始碼:
protected
void
executemigrations
(@nonnull
final
int oldversion,
final
int newversion)
/.sql
try filelist.
add(file);}
catch
(numberformatexception e)
}final map
> migrationmap = databasedefinition.
getmigrations()
;final
int curversion = oldversion +1;
try}
list
migrationslist = migrationmap.
get(i);if
(migrationslist != null)}}
// settransactionsuccessful() 方法設定事務的標誌為成功,則所有從begintransaction()開始的操作都會被提交,如果沒有呼叫settransactionsuccessful() 方法則回滾事務。
// 這裡我懷疑我自己開啟的事務有可能沒有寫這個方法導致了事務回滾
db.settransactionsuccessful()
;}finally
}catch
(ioexception e)
}
/**
* supports multiline sql statements with ended with the standard ";"
** @param db the database to run it on
* @param file the file name in assets/migrations that we read from
*/// 支援多行sql語句,並且必須滿足以分號結尾的標準
private
void
executesqlscript
(@nonnull string file)
if(isendofquery)
query.
(" ").
(line);if
(isendofquery)
} string querystring = query.
tostring()
;if(querystring.
trim()
.length()
>0)
}catch
(ioexception e)
}}
在解決此問題的過程中參考了以下文章,對dbflow及sqlite有了更進一步了解,特別感謝:
dbflow:資料遷移(migrations)
有關dbflow的migration的幾個細節
MySQL增加或修改字段 修改主鍵
1.在 中增加新的字段 alter table 表名 add 欄位名稱 字段型別 例子 alter table if customer order tab add message id decimal 12,0 not null 將新增的字段排在第一位 alter table if customer...
Oracle查詢 增加 刪除 修改主鍵
對oracle表主鍵的操作,有四類 查詢,增加,修改,刪除 1 查詢主鍵 查詢某個表中存在的約束 select from user constraints where table name 表名大寫 查詢結果顯示約束型別,約束名稱,不顯示約束在哪個欄位上 查詢某個表各字段約束 select from...
Mysql 增加主鍵或者修改主鍵的sql語句操作
alter table table1 add transactor varchar 10 not null alter table table1 add id int unsigned not null auto increment primary key alter table 表名稱 chang...