譯文出自:掘金翻譯計畫
譯者: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
表,只想獲得表中按名字排序的第乙個使用者。下面就是實現方法在sqlitedatabase
和supportsqlitedatabase
中的區別。
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 的呼叫替代cursor
和contentvalue
的**。
像在users
表中按名字順序查詢第乙個使用者這個操作應該定義在userdao
介面中。
@dao
public inte***ce userdao
複製**
這個方法會在localdatasource
中被呼叫。
public class localdatasource
}複製**
在單一乙個 pr 中,把 sqlite 遷移乙個大型的資料庫到 room 會生成很多新檔案和更新過後的檔案。這需要一定時間去實現,因此導致 pr 更難檢查。在最開始的 pr,先使用roomdatabase
提供的 openhelper 從而讓**最小程度地改動,然後在接下來的 pr 中才逐漸建立 dao 類去替換cursor
和contentvalue
的**。 譯 從 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 引數 請確...