Use Supabase with Android Kotlin
Learn how to create a Supabase project, add some sample data to your database, and query the data from an Android Kotlin app.
Create a Supabase project
Go to database.new and create a new Supabase project.
Alternatively, you can create a project using the Management API:
1234567891011121314151617# First, get your access token from https://supabase.com/dashboard/account/tokensexport SUPABASE_ACCESS_TOKEN="your-access-token"# List your organizations to get the organization IDcurl -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \  https://api.supabase.com/v1/organizations# Create a new project (replace <org-id> with your organization ID)curl -X POST https://api.supabase.com/v1/projects \  -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \  -H "Content-Type: application/json" \  -d '{    "organization_id": "<org-id>",    "name": "My Project",    "region": "us-east-1",    "db_pass": "<your-secure-password>"  }'When your project is up and running, go to the Table Editor, create a new table and insert some data.
Alternatively, you can run the following snippet in your project's SQL Editor. This will create a instruments table with some sample data.
12345678910111213-- Create the tablecreate table instruments (  id bigint primary key generated always as identity,  name text not null);-- Insert some sample data into the tableinsert into instruments (name)values  ('violin'),  ('viola'),  ('cello');alter table instruments enable row level security;Make the data in your table publicly readable by adding an RLS policy:
1234create policy "public can read instruments"on public.instrumentsfor select to anonusing (true);Create an Android app with Android Studio
Open Android Studio > New > New Android Project.
Install the Dependencies
Open build.gradle.kts (app) file and add the serialization plug, Ktor client, and Supabase client.
Replace the version placeholders $kotlin_version with the Kotlin version of the project, and  $supabase_version and $ktor_version with the respective latest versions.
The latest supabase-kt version can be found here and Ktor version can be found here.
1234567891011plugins {  ...  kotlin("plugin.serialization") version "$kotlin_version"}...dependencies {  ...  implementation(platform("io.github.jan-tennert.supabase:bom:$supabase_version"))  implementation("io.github.jan-tennert.supabase:postgrest-kt")  implementation("io.ktor:ktor-client-android:$ktor_version")}Add internet access permission
Add the following line to the AndroidManifest.xml file under the manifest tag and outside the application tag.
123...<uses-permission android:name="android.permission.INTERNET" />...Initialize the Supabase client
You can create a Supabase client whenever you need to perform an API call.
For the sake of simplicity, we will create a client in the MainActivity.kt file at the top just below the imports.
Replace the supabaseUrl and supabaseKey with your own:
Project URL
Publishable key
Anon key
123456789import ...val supabase = createSupabaseClient(    supabaseUrl = "https://xyzcompany.supabase.co",    supabaseKey = "your_public_anon_key"  ) {    install(Postgrest)}...Create a data model for instruments
Create a serializable data class to represent the data from the database.
Add the following below the createSupabaseClient function in the MainActivity.kt file.
12345@Serializabledata class Instrument(    val id: Int,    val name: String,)Query data from the app
Use LaunchedEffect to fetch data from the database and display it in a LazyColumn.
Replace the default MainActivity class with the following code.
Note that we are making a network request from our UI code. In production, you should probably use a ViewModel to separate the UI and data fetching logic.
1234567891011121314151617181920212223242526272829303132333435363738class MainActivity : ComponentActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContent {            SupabaseTutorialTheme {                // A surface container using the 'background' color from the theme                Surface(                    modifier = Modifier.fillMaxSize(),                    color = MaterialTheme.colorScheme.background                ) {                    InstrumentsList()                }            }        }    }}@Composablefun InstrumentsList() {    var instruments by remember { mutableStateOf<List<Instrument>>(listOf()) }    LaunchedEffect(Unit) {        withContext(Dispatchers.IO) {            instruments = supabase.from("instruments")                              .select().decodeList<Instrument>()        }    }    LazyColumn {        items(            instruments,            key = { instrument -> instrument.id },        ) { instrument ->            Text(                instrument.name,                modifier = Modifier.padding(8.dp),            )        }    }}Start the app
Run the app on an emulator or a physical device by clicking the Run app button in Android Studio.