targets Specific Any Depends on framework Performance Native Native Depends on framework Development Cost Highest Higher High Access to platform APIs Yes Yes Depends on framework Time to market Slowest Average Fastest
platformName(): String = "Android" // actual-ios.kt actual fun platformName(): String = "iOS" // actual-jvm.kt actual fun platformName(): String = "JVM"
platformName(): String = "Android" // actual-ios.kt actual fun platformName(): String = "iOS" // actual-jvm.kt actual fun platformName(): String = "JVM"
// android-remote-source.kt actual class RemoteSource { fun fetchFromServer(): List<Item> { // Retrofit } } // ios-remote-source.kt actual class RemoteSource { fun fetchFromServer(): List<Item> { // AlamoFire / NSURLSession } }
// android-remote-source.kt actual class RemoteSource { fun fetchFromServer(): List<Item> { // Retrofit } } // ios-remote-source.kt actual class RemoteSource { fun fetchFromServer(): List<Item> { // AlamoFire / NSURLSession } }
NOT NULL, myOtherText TEXT NOT NULL ); getAllMyObjects: SELECT * FROM MyObject; insetMyObject: INSERT INTO MyObject (id, myText, myOtherText) VALUES ?;
NOT NULL, myOtherText TEXT NOT NULL ); getAllMyObjects: SELECT * FROM MyObject; insetMyObject: INSERT INTO MyObject (id, myText, myOtherText) VALUES ?;
NOT NULL, myOtherText TEXT NOT NULL ); getAllMyObjects: SELECT * FROM MyObject; insetMyObject: INSERT INTO MyObject (id, myText, myOtherText) VALUES ?;
db by lazy { val driver = requireNotNull(driver) { "No SqlDriver found!" } JokesDatabase.invoke(driver).jokeQueries } fun getJokes(): List<Joke> { return db.getAllJokes().executeAsList() } fun saveJokes(jokes: List<Joke>) { jokes.forEach { db.insertJoke(it) } } } Common Code - Data - Jokes Local Source
db by lazy { val driver = requireNotNull(driver) { "No SqlDriver found!" } JokesDatabase.invoke(driver).jokeQueries } fun getJokes(): List<Joke> { return db.getAllJokes().executeAsList() } fun saveJokes(jokes: List<Joke>) { jokes.forEach { db.insertJoke(it) } } } Common Code - Data - Jokes Local Source
actual object JokesDatabaseDriver { actual var jokesDatabaseDriver: SqlDriver? = null fun createDriver(context: Context) { jokesDatabaseDriver = AndroidSqliteDriver(JokesDatabase.Schema, context, "jokes.db") } } // iOS actual object JokesDatabaseDriver { actual var jokesDatabaseDriver: SqlDriver? = NativeSqliteDriver(JokesDatabase.Schema, "jokes.db") } Common Code - Data - Jokes Local Source
actual object JokesDatabaseDriver { actual var jokesDatabaseDriver: SqlDriver? = null fun createDriver(context: Context) { jokesDatabaseDriver = AndroidSqliteDriver(JokesDatabase.Schema, context, "jokes.db") } } // iOS actual object JokesDatabaseDriver { actual var jokesDatabaseDriver: SqlDriver? = NativeSqliteDriver(JokesDatabase.Schema, "jokes.db") } Common Code - Data - Jokes Local Source
actual object JokesDatabaseDriver { actual var jokesDatabaseDriver: SqlDriver? = null fun createDriver(context: Context) { jokesDatabaseDriver = AndroidSqliteDriver(JokesDatabase.Schema, context, "jokes.db") } } // iOS actual object JokesDatabaseDriver { actual var jokesDatabaseDriver: SqlDriver? = NativeSqliteDriver(JokesDatabase.Schema, "jokes.db") } Common Code - Data - Jokes Local Source
db by lazy { val driver = requireNotNull(driver) { "No SqlDriver found!" } JokesDatabase.invoke(driver).jokeQueries } fun getJokes(): List<Joke> { return db.getAllJokes().executeAsList() } fun saveJokes(jokes: List<Joke>) { jokes.forEach { db.insertJoke(it) } } } Common Code - Data - Jokes Local Source
db by lazy { val driver = requireNotNull(driver) { "No SqlDriver found!" } JokesDatabase.invoke(driver).jokeQueries } fun getJokes(): List<Joke> { return db.getAllJokes().executeAsList() } fun saveJokes(jokes: List<Joke>) { jokes.forEach { db.insertJoke(it) } } } Common Code - Data - Jokes Local Source
NOT NULL, punchline TEXT NOT NULL, type TEXT NOT NULL ); getAllJokes: SELECT * FROM JokeDb; insertJoke: INSERT INTO JokeDb (id, setup, punchline, type) VALUES ?; Common Code - Data - Jokes Local Source