1a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar/* 2a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * Copyright (C) 2017 The Android Open Source Project 3a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * 4a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * you may not use this file except in compliance with the License. 6a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * You may obtain a copy of the License at 7a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * 8a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * 10a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * Unless required by applicable law or agreed to in writing, software 11a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * See the License for the specific language governing permissions and 14a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * limitations under the License. 15a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar */ 16a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.integration.testapp.migration; 18a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 19e185ed6ba937bdc218104c18d2615e1ce524adb7Yigit Boyarimport android.content.ContentValues; 20e185ed6ba937bdc218104c18d2615e1ce524adb7Yigit Boyarimport android.database.sqlite.SQLiteDatabase; 21a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 22bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.ColumnInfo; 23bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Dao; 24bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Database; 25bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Entity; 26bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.ForeignKey; 27bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Ignore; 28bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Index; 29bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Insert; 30bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.PrimaryKey; 31bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.Query; 32bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.RoomDatabase; 33bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.sqlite.db.SupportSQLiteDatabase; 34bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverette 35a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyarimport java.util.List; 36a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 37a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar@SuppressWarnings("WeakerAccess") 38a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar@Database(version = MigrationDb.LATEST_VERSION, 39ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar entities = {MigrationDb.Entity1.class, MigrationDb.Entity2.class, 40ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar MigrationDb.Entity4.class}) 41a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyarpublic abstract class MigrationDb extends RoomDatabase { 42ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar static final int LATEST_VERSION = 7; 43a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar abstract MigrationDao dao(); 44ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar @Entity(indices = {@Index(value = "name", unique = true)}) 453a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar static class Entity1 { 463a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public static final String TABLE_NAME = "Entity1"; 47a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar @PrimaryKey 48a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar public int id; 49a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar public String name; 50a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 51a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 52a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar @Entity 533a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar static class Entity2 { 543a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public static final String TABLE_NAME = "Entity2"; 5563e44ca6060a78f1313a4946655f6f0471681867Yuichi Araki @PrimaryKey(autoGenerate = true) 56a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar public int id; 573a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public String addedInV3; 583a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public String name; 593a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar } 603a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar 613a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar @Entity 623a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar static class Entity3 { // added in version 4, removed at 6 633a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public static final String TABLE_NAME = "Entity3"; 643a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar @PrimaryKey 653a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public int id; 663a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar @Ignore //removed at 5 673a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public String removedInV5; 68a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar public String name; 69a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 70a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 71ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar @Entity(foreignKeys = { 72ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar @ForeignKey(entity = Entity1.class, 73ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar parentColumns = "name", 74ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar childColumns = "name", 75ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar deferred = true)}) 76ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar static class Entity4 { 77ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar public static final String TABLE_NAME = "Entity4"; 78ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar @PrimaryKey 79ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar public int id; 8068c65b3d9b80517aa814aa6090c99568362214ffYuichi Araki @ColumnInfo(collate = ColumnInfo.NOCASE) 81ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar public String name; 82ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar } 83ebdeee2c668f632384a7c9b3a098f0cccf88e7cdYigit Boyar 84a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar @Dao 85a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar interface MigrationDao { 863a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar @Query("SELECT * from Entity1 ORDER BY id ASC") 873a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar List<Entity1> loadAllEntity1s(); 883a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar @Query("SELECT * from Entity2 ORDER BY id ASC") 893a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar List<Entity2> loadAllEntity2s(); 903a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar @Query("SELECT * from Entity2 ORDER BY id ASC") 913a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar List<Entity2Pojo> loadAllEntity2sAsPojo(); 92a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar @Insert 933a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar void insert(Entity2... entity2); 943a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar } 953a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar 963a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar static class Entity2Pojo extends Entity2 { 97a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 98a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 99a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar /** 100a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar * not a real dao because database will change. 101a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar */ 102a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar static class Dao_V1 { 103a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar final SupportSQLiteDatabase mDb; 104a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 105a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar Dao_V1(SupportSQLiteDatabase db) { 106a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar mDb = db; 107a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 108a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar 1093a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public void insertIntoEntity1(int id, String name) { 1103a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar ContentValues values = new ContentValues(); 1113a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar values.put("id", id); 1123a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar values.put("name", name); 113e185ed6ba937bdc218104c18d2615e1ce524adb7Yigit Boyar long insertionId = mDb.insert(Entity1.TABLE_NAME, 114e185ed6ba937bdc218104c18d2615e1ce524adb7Yigit Boyar SQLiteDatabase.CONFLICT_REPLACE, values); 1153a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar if (insertionId == -1) { 1163a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar throw new RuntimeException("test sanity failure"); 1173a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar } 1183a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar } 1193a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar } 1203a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar 1213a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar /** 1223a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar * not a real dao because database will change. 1233a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar */ 1243a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar static class Dao_V2 { 1253a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar final SupportSQLiteDatabase mDb; 1263a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar 1273a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar Dao_V2(SupportSQLiteDatabase db) { 1283a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar mDb = db; 1293a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar } 1303a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar 1313a433f7ddbffa6131883cc3b23fc80edf54add19Yigit Boyar public void insertIntoEntity2(int id, String name) { 132a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar ContentValues values = new ContentValues(); 133a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar values.put("id", id); 134a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar values.put("name", name); 135e185ed6ba937bdc218104c18d2615e1ce524adb7Yigit Boyar long insertionId = mDb.insert(Entity2.TABLE_NAME, 136e185ed6ba937bdc218104c18d2615e1ce524adb7Yigit Boyar SQLiteDatabase.CONFLICT_REPLACE, values); 137a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar if (insertionId == -1) { 138a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar throw new RuntimeException("test sanity failure"); 139a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 140a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 141a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar } 142a64756a18111a7312b3fa03b76d13381a8907176Yigit Boyar} 143