Swift SDK
Swift Quick Start
WoWSQL Swift SDK — Get started in minutes
Get your API key: Use the WoWSQL project dashboard to create or copy your API key. The same key works for database, auth, and storage (unified API key).
Installation
Official package: View on GitHub →
Swift Package Manager: Add to your Package.swift:
// swift-tools-version: 5.9
import PackageDescription
let package = Package(
name: "MyApp",
platforms: [.iOS(.v13), .macOS(.v10_15)],
dependencies: [
.package(url: "https://github.com/WowSQL/wowsql-swift.git", from: "1.0.0")
],
targets: [
.target(
name: "MyApp",
dependencies: ["WowSQL"]
),
]
)
Or in Xcode: File → Add Package Dependencies → https://github.com/WowSQL/wowsql-swift
Initialize Client
import WowSQL
// Initialize client with your API key (same key for database, auth, storage)
let client = WowSQLClient(
projectURL: "myproject",
apiKey: "your_api_key_here"
)
// Or with full URL
let clientFull = WowSQLClient(
projectURL: "https://myproject.wowsql.com",
apiKey: "your_api_key"
)
// Always use select() before get()/execute()
client.table("users").select("*").get { _ in }
Query Data
Basic Queries
client.table("users").select("*").get { result in /* users */ }
client.table("users").select("*").gte("age", 18).get { result in /* adults */ }
client.table("users").select("id", "name").get { result in /* names */ }
Advanced Queries
client.table("users")
.select("*")
.filter("status", "eq", "active")
.filter("age", "gt", 18)
.order("created_at", "desc")
.limit(20)
.offset(0)
.get { result in
if case .success(let users) = result {
print("Found \(users.count) users")
}
}
Filter Helper Methods
client.table("users")
.eq("status", "active")
.gt("age", 18)
.like("email", "%@gmail.com")
.in("role", ["admin", "moderator"])
.between("created_at", "2024-01-01", "2024-12-31")
.get { _ in }
GROUP BY and Aggregates
Basic GROUP BY
client.table("products")
.select("category", "COUNT(*) as count", "AVG(price) as avg_price")
.groupBy("category")
.get { _ in }
HAVING Clause
client.table("products")
.select("category", "COUNT(*) as count")
.groupBy("category")
.having("COUNT(*)", "gt", 10)
.get { _ in }
CRUD Operations
Create Record
client.table("users").create([
"name": "John Doe",
"email": "john@example.com",
"age": 30
]) { result in
if case .success(let r) = result { print("Created ID: \(r["id"] ?? "")") }
}
Update Record
client.table("users").update(123, ["email": "newemail@example.com"]) { _ in }
Delete Record
client.table("users").delete(123) { _ in }
Get Single Record by ID
client.table("users").getById(123) { result in
if case .success(let user) = result { print("User: \(user["name"] ?? "")") }
}
Get First Record
client.table("users").filter("status", "eq", "active").first { result in
if case .success(let user) = result, let u = user { print("First: \(u["name"] ?? "")") }
}
Filter Operators
Available operators: eq, neq, gt, gte, lt, lte, like, is, in, not_in, between, not_between. Use .eq("col", value), .filter("col", "op", value), etc.
Error Handling
client.table("users").select("*").get { result in
switch result {
case .success(let users):
print("Success: \(users.data.count) users")
case .failure(let error):
print("Error: \(error.localizedDescription)")
}
}
Authentication
Use the same API key for authentication. One key works for database and auth.
Sign Up & Sign In
let auth = WowSQLAuth(projectURL: "myproject", apiKey: "your_api_key")
auth.signUp(email: "user@example.com", password: "SecurePassword123", fullName: "John Doe") { result in /* access_token */ }
auth.signIn(email: "user@example.com", password: "SecurePassword123") { result in /* user id */ }
Password Reset
auth.forgotPassword(email: "user@example.com") { _ in }
auth.resetPassword(token: "reset_token", newPassword: "NewSecurePassword123") { _ in }
Storage Operations
Initialize Storage
let storage = WowSQLStorage(
projectURL: "myproject",
apiKey: "your_api_key"
)
File Operations
// Upload file
storage.uploadFromPath("path/to/document.pdf", remotePath: "uploads/document.pdf", folder: "documents") { result in }
// Get file URL
storage.getFileUrl("uploads/document.pdf", expiresIn: 3600) { result in }
// List files
storage.listFiles(prefix: "uploads/") { result in }
// Delete file
storage.deleteFile("uploads/document.pdf") { _ in }
// Check quota
storage.getQuota() { result in }
Download or View File
Via REST: use GET .../files/{file_key}/download for attachment download, or GET .../files/{file_key}/view to view inline in the browser.