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