DBFlow修改表結構 增加主鍵

2021-09-29 12:54:59 字數 4433 閱讀 9197

寫好重建表的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語句失敗,並且原始碼中有try

catch懷疑執行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...