成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android O 遷移測(cè)試:Room

企業(yè)動(dòng)態(tài)
在之前的一篇文章中,我們介紹了一下構(gòu)件組件,其中就提到了使用 Room 來進(jìn)行數(shù)據(jù)庫(kù)操作。以下是您需要了解的有關(guān) Room 遷移測(cè)試的內(nèi)容。

之前的一篇文章中,我們介紹了一下構(gòu)件組件,其中就提到了使用 Room 來進(jìn)行數(shù)據(jù)庫(kù)操作。但我們也有注意到,如果您錯(cuò)誤地實(shí)施遷移,最嚴(yán)重的結(jié)果可能會(huì)導(dǎo)致您的應(yīng)用崩潰或丟失用戶數(shù)據(jù)。

[[204036]]

除此之外,Migration.migrate 在編譯時(shí)不會(huì)檢查在方法中執(zhí)行的 SQL 語句,這導(dǎo)致了更多的問題。了解到這個(gè)情況之后,對(duì)遷移進(jìn)行測(cè)試就成了一項(xiàng)必做任務(wù)。 Room 提供了 MigrationTestHelper 測(cè)試工具,這一工具允許您:

  • 在給定的版本中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
  • 在數(shù)據(jù)庫(kù)上運(yùn)行一組給定的遷移
  • 驗(yàn)證數(shù)據(jù)庫(kù) schema

當(dāng)然,Room 不會(huì)驗(yàn)證數(shù)據(jù)庫(kù)中的數(shù)據(jù)本身。這是您需要親自去實(shí)現(xiàn)的東西。

以下是您需要了解的有關(guān) Room 遷移測(cè)試的內(nèi)容。

工作原理

[[204037]]

為了進(jìn)行遷移測(cè)試,Room 需要知道您當(dāng)前數(shù)據(jù)庫(kù)版本的幾個(gè)要素:版本號(hào)、Entity、Identity Hash,以及為創(chuàng)建和更新 room_master_table 而做出的查詢請(qǐng)求。所有這些都由 Room 在編譯時(shí)自動(dòng)生成,并存儲(chǔ)在schema JSON 文件中。

在 build.gradle 文件中指定一個(gè)文件夾,來放置這些生成的 schema JSON 文件。在更新 schema 時(shí),最終會(huì)出現(xiàn)一些 JSON 文件,每個(gè)版本都將有一個(gè)對(duì)應(yīng)的文件。確保將每個(gè)生成的文件提交給源代碼管理工具。下次再次增加版本號(hào)碼時(shí),Room 可以使用 JSON 文件進(jìn)行測(cè)試。

先決條件

要生成 JSON 文件,請(qǐng)使用以下內(nèi)容更新 build.gradle 文件:

1. 定義 schema 位置

  1. defaultConfig { 
  2.   javaCompileOptions { 
  3.             annotationProcessorOptions { 
  4.                 arguments = ["room.schemaLocation":  
  5.                                 "$projectDir/schemas".toString()] 
  6.             } 
  7.         } 

2. 將 schema 位置添加到源碼目錄

  1. android { 
  2.      
  3.     sourceSets { 
  4.         androidTest.assets.srcDirs +=   
  5.                            files("$projectDir/schemas".toString()) 
  6.     } 

3. 將 Room 測(cè)試庫(kù)添加到依賴列表中

  1. dependencies { 
  2. androidTestImplementation     
  3.                 “android.arch.persistence.room:testing:1.0.0-alpha5” 

遷移測(cè)試規(guī)則

創(chuàng)建數(shù)據(jù)庫(kù)和 schema,打開和關(guān)閉數(shù)據(jù)庫(kù),運(yùn)行遷移 —— 您幾乎需要為每個(gè)測(cè)試編寫大量這樣的樣板代碼。為了避免過度重復(fù)勞動(dòng),請(qǐng)?jiān)谶w移測(cè)試類中使用 MigrationTestHelper 測(cè)試工具。

為了創(chuàng)建數(shù)據(jù)庫(kù)以及驗(yàn)證遷移,MigrationTestHelper 很大程度上依賴于生成的 JSON 文件。

  1. @Rule 
  2. public MigrationTestHelper testHelper = 
  3.         new MigrationTestHelper( 
  4.                 InstrumentationRegistry.getInstrumentation(), 
  5.                 <your_database_class>.class.getCanonicalName(), 
  6.                 new FrameworkSQLiteOpenHelperFactory() 

您可以在特定版本中創(chuàng)建數(shù)據(jù)庫(kù):

  1. // Create the database with version 2 
  2. SupportSQLiteDatabase db =  
  3.                          testHelper.createDatabase(TEST 

您可以運(yùn)行一組遷移,并自動(dòng)驗(yàn)證 schema 是否更新無誤:

  1. db = testHelper.runMigrationsAndValidate(TEST_DB_NAME, 4, validateDroppe 

實(shí)施測(cè)試

測(cè)試策略很簡(jiǎn)單:

  1. 在特定版本中打開數(shù)據(jù)庫(kù);
  2. 插入一些數(shù)據(jù);
  3. 運(yùn)行遷移并驗(yàn)證 schema;
  4. 檢查數(shù)據(jù)庫(kù)中是否有正確的數(shù)據(jù)。

例如,數(shù)據(jù)庫(kù)的版本 3 添加了一個(gè)新列:date 。因此,當(dāng)測(cè)試從版本 2 到版本 3 的遷移時(shí),我們檢查插入到版本 2 的數(shù)據(jù)的有效性,也是我們新列的默認(rèn)值。我們的 AndroidJUnitTest 看起來是這樣的:

  1. @Test 
  2. public void migrationFrom2To3_containsCorrectData() throws  
  3.                                                        IOException { 
  4.     // Create the database in version 2 
  5.     SupportSQLiteDatabase db =  
  6.                          testHelper.createDatabase(TEST_DB_NAME, 2); 
  7.     // Insert some data 
  8.     insertUser(USER.getId(), USER.getUserName(), db); 
  9.     //Prepare for the next version 
  10.     db.close(); 
  11.  
  12.     // Re-open the database with version 3 and provide MIGRATION_1_2   
  13.     // and MIGRATION_2_3 as the migration process. 
  14.     testHelper.runMigrationsAndValidate(TEST_DB_NAME, 3,    
  15.               validateDroppedTables, MIGRATION_1_2, MIGRATION_2_3); 
  16.  
  17.     // MigrationTestHelper automatically verifies the schema   
  18.     //changes, but not the data validity 
  19.     // Validate that the data was migrated properly. 
  20.     User dbUser = getMigratedRoomDatabase().userDao().getUser(); 
  21.     assertEquals(dbUser.getId(), USER.getId()); 
  22.     assertEquals(dbUser.getUserName(), USER.getUserName()); 
  23.     // The date was missing in version 2, so it should be null in  
  24.     //version 3 
  25.     assertEquals(dbUser.getDate(), null); 

測(cè)試從 SQLiteDatabase 到 Room 的遷移

從標(biāo)準(zhǔn) SQLiteDatabase 到 Room 的步驟雖然乍一看很直觀,但我們覺得有必要詳細(xì)介紹如何測(cè)試遷移實(shí)現(xiàn)。

因?yàn)樵镜臄?shù)據(jù)庫(kù)沒有使用 Room 實(shí)現(xiàn),自然我們就沒有相應(yīng)的 JSON 文件,因此我們無法使用 MigrationTestHelper 創(chuàng)建數(shù)據(jù)庫(kù)。

我們需要這么做:

  1. 擴(kuò)展 SQLiteOpenHelper 類,并在 onCreate 執(zhí)行創(chuàng)建數(shù)據(jù)庫(kù)表的 SQL 查詢操作;
  2. 在 @Before 測(cè)試方法中,創(chuàng)建數(shù)據(jù)庫(kù);
  3. 在 @After 測(cè)試方法中,清除數(shù)據(jù)庫(kù);
  4. 使用 SQLiteOpenHelper ,來插入測(cè)試所需的數(shù)據(jù),檢查從SQLiteDatabase 版本遷移到使用 Room 的版本;
  5. 使用 MigrationTestHelper 運(yùn)行遷移和驗(yàn)證 schema;
  6. 檢查數(shù)據(jù)庫(kù)數(shù)據(jù)的有效性。

數(shù)據(jù)庫(kù)版本 1 使用 SQLiteDatabase 實(shí)現(xiàn),然后在版本 2 中,我們遷移到了 Room,而在版本 3 中,我們添加了一個(gè)新的列。檢查從版本 1 到 3 的遷移測(cè)試如下所示:

  1. @Test 
  2. public void migrationFrom1To3_containsCorrectData() throws IOException { 
  3.     // Create the database with the initial version 1 schema and     
  4.     //insert a user 
  5.     SqliteDatabaseTestHelper.insertUser(1, USER.getUserName(), sqliteTestDbHelper); 
  6.  
  7.     // Re-open the database with version 3 and provide MIGRATION_1_2  
  8.     // and MIGRATION_2_3 as the migration process. 
  9.     testHelper.runMigrationsAndValidate(TEST_DB_NAME, 3, true, 
  10.             MIGRATION_1_2, MIGRATION_2_3); 
  11.  
  12.     // Get the latest, migrated, version of the database 
  13.     // Check that the correct data is in the database 
  14.     User dbUser = getMigratedRoomDatabase().userDao().getUser(); 
  15.     assertEquals(dbUser.getId(), 1); 
  16.     assertEquals(dbUser.getUserName(), USER.getUserName()); 
  17.     // The date was missing in version 2, so it should be null in    
  18.     //version 3 
  19.     assertEquals(dbUser.getDate(), null); 

挽起袖子試試吧!

[[204038]]

這里有一個(gè)示例 App:

https://github.com/googlesamples/android-architecture-components/tree/master/PersistenceMigrationsSample

您可以在此示例應(yīng)用中查看實(shí)現(xiàn)。為了簡(jiǎn)化比較,每個(gè)數(shù)據(jù)庫(kù)版本都是以自己的風(fēng)格實(shí)現(xiàn)的,相信看完之后您已經(jīng)能玩轉(zhuǎn)典型的遷移路徑了:

  1. sqlite:使用 SQLiteOpenHelper 和傳統(tǒng)的 SQLite 界面;
  2. room :使用 Room 替換實(shí)現(xiàn),并提供到版本 2 的遷移;
  3. room2:將數(shù)據(jù)庫(kù)更新為新 schema,版本 3;
  4. room3: 將數(shù)據(jù)庫(kù)更新為新的版本 4。提供從版本 2 到 3,版本 3 到 4,以及版本 1 到 4 的遷移路徑。

使用 Room,您可以很容易地實(shí)施和測(cè)試遷移。MigrationTestHelper 允許您在任何版本打開數(shù)據(jù)庫(kù)、運(yùn)行遷移,并且只需幾行代碼就可以驗(yàn)證 schema。

【本文是51CTO專欄機(jī)構(gòu)“谷歌開發(fā)者”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者(微信公眾號(hào):Google_Developers)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-06-30 09:36:10

Android OAPI兼容

2015-08-28 09:12:44

云測(cè)O2O

2022-01-19 12:23:36

云遷移云端

2022-12-29 08:57:34

Android本地?cái)?shù)據(jù)存儲(chǔ)

2019-03-25 12:20:29

數(shù)據(jù)MySQL性能測(cè)試

2025-06-10 08:15:00

LLM大語言模測(cè)試

2017-09-18 10:26:05

Android OAndroid應(yīng)用安裝

2013-05-09 10:51:44

2011-12-14 10:06:55

UnixLinux服務(wù)器

2017-08-16 14:08:46

Android O圖標(biāo)視覺

2013-01-15 13:28:24

盈利模式移動(dòng)互聯(lián)網(wǎng)O2O

2015-10-15 09:57:08

光合資本

2013-01-15 13:59:14

2013O2O細(xì)分領(lǐng)域

2025-04-09 08:21:10

2014-06-13 11:25:04

Android 5.0

2017-09-18 22:55:46

GoogleAndroidRTDB

2011-12-14 09:46:14

LinuxUnix遷移

2015-10-15 17:44:15

O2O

2015-01-06 10:24:23

O2OO2O項(xiàng)目

2014-11-07 14:47:33

微訪談
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本欧美在线视频 | 亚洲人成人网 | 亚洲一区视频在线 | 亚洲高清免费 | 中文字幕在线一 | 91大神在线资源观看无广告 | 少妇久久久久 | 久久亚洲天堂 | 久久久999国产精品 中文字幕在线精品 | 国产一区二区三区四区五区3d | 97视频在线观看免费 | www性色 | 午夜在线 | 青春草91 | 欧美三级电影在线播放 | 国产99久久精品一区二区永久免费 | 亚洲国产精品99久久久久久久久 | 成人在线精品视频 | 毛片国产| 91在线免费视频 | 精品欧美激情在线观看 | 国产精品久久久久久吹潮 | 99精品国产一区二区三区 | 国产精品久久久久一区二区三区 | 蜜桃视频在线观看免费视频网站www | 精品网 | 欧美亚洲国语精品一区二区 | 在线免费观看黄a | 日本a v在线播放 | 色综合久| 日韩成人av在线播放 | 亚洲图片一区二区三区 | 日韩视频一区在线观看 | 欧美伦理一区 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 欧美日韩亚洲国产 | 成人精品毛片 | 999精品在线观看 | 日韩成人在线视频 | 成人免费大片黄在线播放 | 亚洲成人黄色 |