
Alec Strong Jake Wharton data class Player(A val name: String, val ranking: Int, val country: String )A @Entity data class Player(A val name: String, val ranking: Int, val country: String )A @Entity data class Player(A val name: String, val ranking: Int, val country: String )A @Entity data class Match(A val player1: Player, val player2: Player, val winner: Player )A Annotation Processor @Entity data class Player(A val name: String, val ranking: Int, val country: String )A @Entity data class Match(A Source val player1: PlayerCode, val player2: Player, val winner: Player )A Reflection Annotation Processor @Entity data class Player(A val name: String, val ranking: Int, val country: String )A @Entity data class Match(A Source val player1: PlayerCode, SQLite val player2: Player, val winner: Player )A Reflection CREATE TABLE player (A name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); CREATE TABLE match (A player1 INTEGER NOT NULL REFERENCES player, player2 INTEGER NOT NULL REFERENCES player, winner INTEGER NOT NULL REFERENCES player ); CREATE TABLE player (A id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); CREATE TABLE match (A player1 INTEGER NOT NULL REFERENCES player, player2 INTEGER NOT NULL REFERENCES player, winner INTEGER NOT NULL REFERENCES player );B CREATE TABLE player (A id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); CREATE TABLE match (A player1 INTEGER NOT NULL REFERENCES player, player2 INTEGER NOT NULL REFERENCES player, winner INTEGER NOT NULL REFERENCES player, PRIMARY KEY (player1, player2) ) WITHOUT ROWID;B Annotation Processor @Entity CREATE TABLE player (A data class Player( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, val name: String, name TEXT NOT NULL, val ranking: Int, country TEXT NOT NULL, ranking INTEGER NOT NULL val country: String ); ) CREATE TABLE match (A @Entity player1 INTEGER NOT NULL REFERENCES player, Sourcedata class Match( Code player2 INTEGERSQLite NOT NULL REFERENCES player, val player1: Player, winner INTEGER NOT NULL REFERENCES player, val player2: Player, PRIMARY KEY (player1, player2) val winner: Player ) WITHOUT ROWID; ) Reflection @Entity data class Player(A val name: String, val ranking: Int, val country: String )A @Entity data class Match(A val player1: Player, val player2: Player, val winner: Player )A @Entity data class Player(A @PrimaryKey @Autoincrement val id: Int, val name: String, val ranking: Int, val country: String )A @Entity data class Match(A val player1: Player, val player2: Player, val winner: Player )A @Entity data class Player(A @PrimaryKey @Autoincrement val id: Int, val name: String, val ranking: Int, val country: String )A @Entity(primaryKeys = ['player1', ‘player2']) data class Match(A val player1: Player, val player2: Player, val winner: Player )A @Entity dataA class Player(A @PrimaryKey @Autoincrement val id: Int, val name: String, val ranking: Int, val country: String )A @Entity(primaryKeys = ['player1', ‘player2']) data class Match(A val player1: Player, val player2: Player, val winner: Player )A ALTER TABLE player ADD COLUMN id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT; CREATE TABLE new_match ( player1 INTEGER NOT NULL REFERENCES player, player2 INTEGER NOT NULL REFERENCES player, winner INTEGER NOT NULL REFERENCES player, PRIMARY KEY (player1, player2) ) WITHOUT ROWID; -- migrate match to new_match QueryBuilders QueryBuilders jakes.link/resurgence-of-sql SQL Delight Annotation Processor Source Code SQLite Reflection Generated SQLite Compiler Code CREATE TABLE player (A id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); CREATE TABLE player (A id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); withRanking: SELECT * FROM player WHERE ranking = ?; CREATE TABLE player (A id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL Generated ); withRanking:SQLite Compiler SELECT * FROM player WHERE ranking = ?; Code interface PlayerModel {A long id(); @NonNull String name(); @NonNull String country(); long ranking(); final class Factory<T extends PlayerModel> {A public Factory(Creator<T> creator); public SqlDelightQuery withRanking(long ranking); public RowMapper<T> withRankingMapper(); }A }A interface PlayerModel {A … final class Factory<T extends PlayerModel> {A public Factory(Creator<T> creator); … }B }A @AutoValue public abstract class MyPlayerModel implements PlayerModel {A public static Factory<MyPlayerModel> FACTORY = new Factory(AutoValue_MyPlayerModel::new) }A interface PlayerModel {A … final class Factory<T extends PlayerModel> {A public Factory(Creator<T> creator); public SqlDelightQuery withRanking(long ranking); public RowMapper<T> withRankingMapper(); }B }A SqlDelightStatement query = MyPlayerModel.FACTORY.withRanking(10); Observable<List<MyPlayerModel>> rank10 = db.createQuery(query.tables, query.statement, query.args) .mapToList(MyPlayerModel.FACTORY::withRankingMapper); SQL Delight 0.7 QueryBuilders jakes.link/embracing-sql SQL Delight 1.0 CREATE TABLE player ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); withRanking: Generated SELECT * FROM player SQLite Compiler WHERE ranking = ?; insertPlayer: INSERT INTO player (name, country, ranking) Code VALUES (?, ?, ?); CREATE TABLE player ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); withRanking: SELECT * FROM player WHERE ranking = ?; insertPlayer: INSERT INTO player (name, country, ranking) VALUES (?, ?, ?); CREATE TABLE player ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); withRanking: Generated SELECT * FROM player SQLite Compiler WHERE ranking = ?; insertPlayer: INSERT INTO player (name, country, ranking) Code VALUES (?, ?, ?); interface Player {A val id: Long val name: String val country: String val ranking: Long data class Impl(A override val id: Long, override val name: String, override val country: String, override val ranking: Long ) : Player }A class PlayerQueries : Transacter {A fun <T : Any> withRanking( ranking: Long, mapper: ( id: Long, name: String, country: String, ranking: Long ) -> T ): Query<T> fun withRanking(ranking: Long): Query<Player> fun insertPlayer( name: String, country: String, ranking: Long ): Long }A headToHead: SELECT player1.name AS player1Name, player2.name AS player2Name, count(nullif(match.winner = player1.id, 0)) AS player1Wins, count(nullif(match.winner = player2.id, 0)) AS player2Wins FROM match JOIN player AS player1 ON (player1.name = :firstPlayerName AND (player1.id = match.player1 OR player1.id = match.player2) ) JOIN player AS player2 ON (player2.name = :secondPlayerName AND (player2.id = match.player1 OR player2.id = match.player2) ) ; class PlayerQueries : Transacter {A fun <T : Any> headToHead( firstPlayerName: String, secondPlayerName: String, mapper: ( player1Name: String, player2Name: String, player1Wins: Long, player2Wins: Long ) -> T ): Query<T> fun headToHead( firstPlayerName: String, secondPlayerName: String ): Query<com.sample.tennis.db.HeadToHead> }A class PlayerQueries : Transacter {A fun <T : Any> withRanking( ranking: Long, mapper: ( id: Long, name: String, country: String, ranking: Long ) -> T ): Query<T> fun withRanking(ranking: Long): Query<Player> fun insertPlayer( name: String, country: String, ranking: Long ): Long }A class PlayerQueries : Transacter {A fun withRanking(ranking: Long): Query<Player> }A val player: Query<Player> = playerQueries.withRanking(10) class PlayerQueries : Transacter {A fun withRanking(ranking: Long): Query<Player> }A val player: Query< Player => playerQueries.withRanking(10).executeAsOne() class PlayerQueries : Transacter {A fun withRanking(ranking: Long): Query<Player> }A val player: Observable<Query<Player>> = playerQueries.withRanking( 10 ) .executeAsOne() .asObservable() class PlayerQueries : Transacter {A fun withRanking(ranking: Long): Query<Player> }A val player: Observable<List<Player>> = playerQueries.withRanking(10) .asObservable() .mapToList() class PlayerQueries : Transacter {A fun <T : Any> withRanking(ranking: Long, mapper: ( id: Long, name: String, country: String, ranking: Long ) -> T ): Query< TPlayer> }A val player = playerQueries.withRanking(10, ::MyPlayer) class PlayerQueries : Transacter {A fun insertPlayer( name: String, country: String, ranking: Long ): Long }A val id = playerQueries.insertPlayer( name = "Roger Federer", country = "Switzerland", ranking = 2 ) CREATE TABLE player (A id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, class PlayerQueries : Transacter {A country TEXT NOT NULL, fun insertPlayer( ranking INTEGER NOT NULL Generated name: String, ); country: String, ranking: Long SQLite Compiler ): Long withRanking: }A SELECT * FROM player Code WHERE ranking = ?; CREATE TABLE player ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT NOT NULL, ranking INTEGER NOT NULL ); import com.tennis.db.CountryCode; CREATE TABLE player ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, country TEXT AS CountryCode NOT NULL, ranking INTEGER NOT NULL ); import com.tennis.db.CountryCode; CREATE TABLE player ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages211 Page
-
File Size-