譯 從 SQLite 逐步遷移到 Room

2021-09-11 13:35:06 字數 4133 閱讀 6078

譯文出自:掘金翻譯計畫

譯者:illlllliil

校對者:tanglie1993, jaymz1439

通過可管理的 pr 將複雜的資料庫遷移到 room

不過,如果你的資料庫較大或者有複雜的查詢操作的話,實現所有 entity 類,dao 類,dao的測試類並且替換sqliteopenhelper的使用就會耗費很多時間。你最終會需要乙個大改動的 pull request,去實現這些和檢查。讓我們看看你怎麼通過可管理的 pr(pull request),逐步從 sqlite 遷移到 room。

文長不讀的話,可以看下面的概括點:

第乙個 pr:建立你的entity類,roomdatabase,並且更新你自定義的 sqliteopenhelper 為supportsqliteopenhelper

其餘的 pr:建立 dao 類去代替有 cursor 和 contentvalue 的**。

我們考慮有以下這些情況:

你第乙個 pr 會包含設定 room 所需的最小幅度改動操作。

建立 entity 類

如果你已經有每張表資料的 model 物件類,就只用新增@entity@primarykey@columninfo的註解。

+ @entity(tablename = "users")

public class user

public int getid

() public string getusername

() }

複製**

建立 room 資料庫

建立乙個繼承roomdatabase的抽象類。在@database註解中,列出所有你已建立的 entity 類。現在,我們就不用再建立 dao 類了。

更新你資料庫版本號並生成乙個 migration 物件。如果你沒改資料庫的 schema,你仍需要生成乙個空的 migration 物件讓 room 保留已有的資料。

@database(entities = {}, 

version = )

private static usersdatabase instance;

static final migration migration__= new migration(, )

};複製**

一開始,我們的localdatasource類使用customopenhelper進行工作,現在我要把它更新為使用**supportsqliteopenhelper**,這個類可以從roomdatabase.getopenhelper()獲得。

public class localuserdatasource 

複製**

因為supportsqliteopenhelper並不是直接繼承sqliteopenhelper,而是對它的一層包裝,我們需要更改獲得可寫可讀資料庫的呼叫方式,並使用supportsqlitedatabase而不再是sqlitedatabase

supportsqlitedatabase db = mdbhelper.getwritabledatabase();

複製**

supportsqlitedatabase是乙個資料庫抽象層,提供類似sqlitedatabase中的方法。因為它提供了乙個更簡潔的 api 去執行插入和查詢資料庫的操作,**相比以前也需要做一些改動。

對於插入操作,room 移除了可選的nullcolumnhack引數。使用supportsqlitedatabase.insert代替sqlitedatabase.insertwithonconflict

@override

public void insertorupdateuser(user user)

複製**

要查詢的話,supportsqlitedatabase提供了4種方法:

cursor query(string query);

cursor query(string query, object bindargs);

cursor query(supportsqlitequery query);

cursor query(supportsqlitequery query, cancellationsignal cancellationsignal);

複製**

如果你只是簡單地使用原始的查詢操作,那在這裡就沒有什麼要改的。如果你的查詢是較複雜的,你就得通過supportsqlitequerybuilder建立乙個supportsqlitequery

舉個例子,我們有乙個users表,只想獲得表中按名字排序的第乙個使用者。下面就是實現方法在sqlitedatabasesupportsqlitedatabase中的區別。

public user getfirstuseralphabetically

() ;

// 按字母順序從表中獲取第乙個使用者

- cursor cursor = db.query(table_name, projection, null,

- null, null, null, column_name_username + 「 asc 「, 「1」);

+ supportsqlitequery query =

+ supportsqlitequerybuilder.builder(table_name)

+ .columns(projection)

+ .orderby(column_name_username)

+ .limit(「1」)

+ .create();

+ cursor cursor = db.query(query);

if (c !=null && c.getcount() > 0)

if (c !=null)

db.close();

return user;

}複製**

既然你的資料層已經在使用 room,你可以開始逐漸建立 dao 類(附帶測試)並通過 dao 的呼叫替代cursorcontentvalue的**。

像在users表中按名字順序查詢第乙個使用者這個操作應該定義在userdao介面中。

@dao

public inte***ce userdao

複製**

這個方法會在localdatasource中被呼叫。

public class localdatasource 

}複製**

在單一乙個 pr 中,把 sqlite 遷移乙個大型的資料庫到 room 會生成很多新檔案和更新過後的檔案。這需要一定時間去實現,因此導致 pr 更難檢查。在最開始的 pr,先使用roomdatabase提供的 openhelper 從而讓**最小程度地改動,然後在接下來的 pr 中才逐漸建立 dao 類去替換cursorcontentvalue的**。

譯 從 SQLite 逐步遷移到 Room

譯文出自 掘金翻譯計畫 譯者 illlllliil 校對者 tanglie1993,jaymz1439 通過可管理的 pr 將複雜的資料庫遷移到 room 不過,如果你的資料庫較大或者有複雜的查詢操作的話,實現所有 entity 類,dao 類,dao的測試類並且替換sqliteopenhelper...

從 ADT 遷移到 Android Studio

如果你看到上面的優點,已經克服了心中的懷疑和恐懼,準備動手遷移,下面提供一些遷移提示。部分需要科學上網 你無法科學上網?趕緊搜一下,自己搭或者買乙個吧。世界如此多嬌,人生苦短。將你遇到過問題的出錯資訊用 google 搜尋,第一條來自 stackoverflow 的答案就是你想要的。android ...

從 Redis 遷移到 SSDB

工具 在tools目錄中的redis import.phpphp 指令碼可以用來將 redis 伺服器上的資料,拷貝到 ssdb 伺服器上 用法 php redis import.php redis host redis port redis db ssdb host ssdb port 引數 請確...