使用 Supabase 与 Expo React Native
了解如何创建一个 Supabase 项目,向你的数据库添加一些示例数据,并从一个 Expo 应用中查询这些数据。
1# First, get your access token from https://supabase.org.cn/dashboard/account/tokens2export SUPABASE_ACCESS_TOKEN="your-access-token"34# List your organizations to get the organization ID5curl -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \6 https://api.supabase.com/v1/organizations78# Create a new project (replace <org-id> with your organization ID)9curl -X POST https://api.supabase.com/v1/projects \10 -H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \11 -H "Content-Type: application/json" \12 -d '{13 "organization_id": "<org-id>",14 "name": "My Project",15 "region": "us-east-1",16 "db_pass": "<your-secure-password>"17 }'1-- Create the table2create table instruments (3 id bigint primary key generated always as identity,4 name text not null5);6-- Insert some sample data into the table7insert into instruments (name)8values9 ('violin'),10 ('viola'),11 ('cello');1213alter table instruments enable row level security;通过添加 RLS 策略使表格中的数据可公开读取
1create policy "public can read instruments"2on public.instruments3for select to anon4using (true);创建一个 Expo 应用
使用 create-expo-app 命令和空白 TypeScript 模板创建一个最小的 Expo 应用。
探索适用于你的 Supabase 应用的即用型 UI 组件。
基于 shadcn/ui 构建的 UI 组件,通过单个命令连接到 Supabase。
探索组件终端
1npx create-expo-app my-app --template blank-typescript安装 Supabase 客户端库
最快入门的方法是使用 @supabase/supabase-js 客户端库,它为从 React Native 应用中使用 Supabase 提供了便捷的接口。
导航到 Expo 应用并安装 supabase-js 以及安全存储和 URL 处理所需的依赖项。
终端
1cd my-app && npx expo install @supabase/supabase-js react-native-url-polyfill expo-sqlite声明 Supabase 环境变量
在项目的根目录下创建一个 .env 文件,并用你的 Supabase 连接变量填充它。
Expo 要求环境变量以 EXPO_PUBLIC_ 前缀开头,才能在你的应用代码中访问。
项目 URL
可发布密钥
匿名密钥
.env
1EXPO_PUBLIC_SUPABASE_URL=<SUBSTITUTE_SUPABASE_URL>2EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=<SUBSTITUTE_SUPABASE_PUBLISHABLE_KEY>你还可以从 项目的 连接 对话框 获取项目 URL 和密钥。
API 密钥的更改
Supabase 正在更改密钥的工作方式,以提高项目安全性和开发人员体验。您可以 阅读完整的公告,但在过渡期间,您可以使用当前的 anon 和 service_role 密钥以及新的可发布密钥,格式为 sb_publishable_xxx,它将取代旧的密钥。
在大多数情况下,你可以从 项目的 连接 对话框 获取正确的密钥,但如果你想要特定的密钥,你可以在 项目的设置页面的 API 密钥部分 找到所有密钥
- 对于旧版密钥,从 旧版 API 密钥 选项卡中复制
anon密钥用于客户端操作,并复制service_role密钥用于服务器端操作。 - 对于新密钥,打开 API 密钥 选项卡,如果您还没有可发布密钥,请单击 创建新的 API 密钥,并复制 可发布密钥 部分中的值。
阅读 API 密钥文档 以全面了解所有密钥类型及其用途。
初始化 Supabase 客户端
在 lib/supabase.ts 创建一个辅助文件,使用环境变量初始化 Supabase 客户端。
下面的代码使用 Expo 的 localStorage polyfill 来持久化身份验证会话。
lib/supabase.ts
1import 'react-native-url-polyfill/auto'2import { createClient } from '@supabase/supabase-js'3import 'expo-sqlite/localStorage/install';45const supabaseUrl = process.env.EXPO_PUBLIC_SUPABASE_URL6const supabaseAnonKey = process.env.EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY78export const supabase = createClient(supabaseUrl, supabaseAnonKey, {9 auth: {10 storage: localStorage,11 autoRefreshToken: true,12 persistSession: true,13 detectSessionInUrl: false,14 },15})从应用查询数据
用以下代码替换 App.tsx 的内容,以获取并显示数据库中的乐器。
使用 useEffect 在组件挂载时获取数据,并使用 React Native 组件显示查询结果。
App.tsx
1import { useEffect, useState } from 'react'2import { StyleSheet, View, FlatList, Text } from 'react-native'3import { supabase } from './lib/supabase'45export default function App() {6 const [instruments, setInstruments] = useState([])78 useEffect(() => {9 getInstruments()10 }, [])1112 async function getInstruments() {13 const { data } = await supabase.from('instruments').select()14 setInstruments(data)15 }1617 return (18 <View style={styles.container}>19 <FlatList20 data={instruments}21 keyExtractor={(item) => item.id.toString()}22 renderItem={({ item }) => (23 <Text style={styles.item}>{item.name}</Text>24 )}25 />26 </View>27 )28}2930const styles = StyleSheet.create({31 container: {32 flex: 1,33 backgroundColor: '#fff',34 paddingTop: 50,35 paddingHorizontal: 16,36 },37 item: {38 padding: 16,39 borderBottomWidth: 1,40 borderBottomColor: '#ccc',41 },42})启动应用
运行开发服务器,并使用手机上的 Expo Go 应用扫描二维码,或者按 i 打开 iOS 模拟器,按 a 打开 Android 模拟器。
终端
1npx expo start