kotlin
plugins {
id("com.squareup.sqldelight") version "1.5.0"
}
kotlin
dependencies {
implementation "com.squareup.sqldelight:runtime:1.5.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0"
implementation "com.squareup.okhttp3:okhttp:4.9.1"
}
sql
CREATE TABLE SearchResults (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
url TEXT NOT NULL,
snippet TEXT NOT NULL
);
kotlin
sqldelight {
SearchData {
packageName = "com.example.search.data"
schemaOutputDirectory = file("src/main/kotlin")
outputDialects = setOf(SqlDelightDatabase.SchemaOutput.JAVA)
}
}
./gradlew generateSearchDataSqlDelightInterface
kotlin
import okhttp3.HttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
class BaiduSearchService(private val apiKey: String) {
private val client by lazy {
OkHttpClient()
}
suspend fun search(query: String): List<SearchResult> {
val url = buildUrl(query)
val request = Request.Builder().url(url).build()
val response = client.newCall(request).await()
val responseBody = response.body()?.string()
return parseSearchResults(responseBody)
}
private fun buildUrl(query: String): HttpUrl {
return HttpUrl.Builder()
.scheme("https")
.host("api.baidu.com")
.addPathSegment("search")
.addQueryParameter("apikey", apiKey)
.addQueryParameter("query", query)
.build()
}
private fun parseSearchResults(responseBody: String?): List<SearchResult> {
}
}
@Serializable
data class SearchResult(
@SerialName("title")
val title: String,
@SerialName("url")
val url: String,
@SerialName("snippet")
val snippet: String
)
kotlin
import com.example.search.data.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class SearchRepository(private val searchDataQueries: SearchDataQueries, private val baiduSearchService: BaiduSearchService) {
suspend fun search(query: String) {
withContext(Dispatchers.IO) {
val searchResults = baiduSearchService.search(query)
searchDataQueries.beginTransaction()
searchDataQueries.clearSearchResults()
searchDataQueries.insertSearchResults(searchResults.map { result ->
SearchData.SearchResult(
title = result.title,
url = result.url,
snippet = result.snippet
)
})
searchDataQueries.commit()
}
}
}