square/sqlbrite
A lightweight wrapper around SQLiteOpenHelper which introduces reactive stream semantics to SQL operations.
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓14 active contributors
- ✓Apache-2.0 licensed
- ✓CI configured
Show all 6 evidence items →Show less
- ✓Tests present
- ⚠Stale — last commit 6y ago
- ⚠Concentrated ownership — top contributor handles 78% of recent commits
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/square/sqlbrite)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/square/sqlbrite on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: square/sqlbrite
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/square/sqlbrite shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across all four use cases
- 14 active contributors
- Apache-2.0 licensed
- CI configured
- Tests present
- ⚠ Stale — last commit 6y ago
- ⚠ Concentrated ownership — top contributor handles 78% of recent commits
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live square/sqlbrite
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/square/sqlbrite.
What it runs against: a local clone of square/sqlbrite — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in square/sqlbrite | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch trunk exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 2120 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of square/sqlbrite. If you don't
# have one yet, run these first:
#
# git clone https://github.com/square/sqlbrite.git
# cd sqlbrite
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of square/sqlbrite and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "square/sqlbrite(\\.git)?\\b" \\
&& ok "origin remote is square/sqlbrite" \\
|| miss "origin remote is not square/sqlbrite (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify trunk >/dev/null 2>&1 \\
&& ok "default branch trunk exists" \\
|| miss "default branch trunk no longer exists"
# 4. Critical files exist
test -f "sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteDatabase.java" \\
&& ok "sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteDatabase.java" \\
|| miss "missing critical file: sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteDatabase.java"
test -f "sqlbrite/src/main/java/com/squareup/sqlbrite3/SqlBrite.java" \\
&& ok "sqlbrite/src/main/java/com/squareup/sqlbrite3/SqlBrite.java" \\
|| miss "missing critical file: sqlbrite/src/main/java/com/squareup/sqlbrite3/SqlBrite.java"
test -f "sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteContentResolver.java" \\
&& ok "sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteContentResolver.java" \\
|| miss "missing critical file: sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteContentResolver.java"
test -f "sqlbrite/src/main/java/com/squareup/sqlbrite3/QueryObservable.java" \\
&& ok "sqlbrite/src/main/java/com/squareup/sqlbrite3/QueryObservable.java" \\
|| miss "missing critical file: sqlbrite/src/main/java/com/squareup/sqlbrite3/QueryObservable.java"
test -f "sqlbrite/build.gradle" \\
&& ok "sqlbrite/build.gradle" \\
|| miss "missing critical file: sqlbrite/build.gradle"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 2120 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~2090d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/square/sqlbrite"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
SqlBrite is a lightweight reactive wrapper around Android's SupportSQLiteOpenHelper that adds RxJava Observable semantics to SQL queries. It automatically notifies subscribed queries whenever the underlying tables are modified (insert/update/delete), eliminating manual cache invalidation and enabling live data streams without polling. The core capability is turning static SQL queries into reactive streams that emit fresh results on every database change. Single-library structure: core library code wraps SupportSQLiteOpenHelper, exposing BriteDatabase and Query classes that emit Observable<Query> streams. Sample app at sample/src/main/java/com/example/sqlbrite/todo/ demonstrates a todo app using Dagger2 dependency injection (TodoComponent, TodoModule) with separate db/ and ui/ layers. Build system uses Gradle with Android gradle plugin 3.0.1.
👥Who it's for
Android developers building data-driven apps who want reactive query patterns without managing subscriptions and cache invalidation manually. Specifically useful for teams using RxJava2 who need real-time UI updates triggered by database changes (e.g., todo apps, messaging, inventory systems).
🌱Maturity & risk
Deprecated and no longer actively developed—Square officially moved to SQLDelight for database features and Copper for content provider monitoring (see README). The codebase is stable (no recent commits visible) and considered 'complete' rather than abandoned, suggesting it works reliably for existing users. Not recommended for new projects; use SQLDelight instead.
HIGH RISK for new development: library is deprecated with no active maintenance. Dependency on RxJava2 (version 2.1.3, relatively old) and Android Support Library v27 (superseded by AndroidX) means compatibility issues with modern Android stacks. Single-maintainer (Square) decision to deprecate suggests future Android compatibility breaks are possible. Existing apps using it will face maintenance burden as Android APIs evolve.
Active areas of work
No active development—repository appears dormant. README explicitly states 'This library is no longer actively developed and is considered complete.' No PRs, issues, or commits visible in provided data. This is a maintenance-only state.
🚀Get running
git clone https://github.com/square/sqlbrite.git
cd sqlbrite
./gradlew build
./gradlew :sample:assembleDebug # Build the sample todo app
Note: You'll need Android SDK (API 27+) and JDK8+ installed.
Daily commands:
# Build library
./gradlew clean build
# Run sample app on emulator/device
./gradlew :sample:assembleDebug
adb install sample/build/outputs/apk/debug/sample-debug.apk
# Run tests (if present)
./gradlew test
🗺️Map of the codebase
sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteDatabase.java— Core wrapper around SupportSQLiteOpenHelper that exposes reactive query semantics; every contributor must understand the main API surface.sqlbrite/src/main/java/com/squareup/sqlbrite3/SqlBrite.java— Entry point and builder for the library; defines the primary public API for creating BriteDatabase instances.sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteContentResolver.java— Reactive wrapper around ContentResolver; handles content provider monitoring via observable patterns.sqlbrite/src/main/java/com/squareup/sqlbrite3/QueryObservable.java— Core reactive abstraction that emits query results as Observable streams when data changes.sqlbrite/build.gradle— Defines core library dependencies (RxJava, support-sqlite) and build configuration for the main module.sample/src/main/java/com/example/sqlbrite/todo/db/Db.java— Reference implementation showing idiomatic SqlBrite usage patterns in a real Android app.README.md— Clearly documents that the library is deprecated; all contributors must know SQLDelight is the modern replacement.
🛠️How to make changes
Add a new reactive database query
- Define the table schema in your SQL migrations or database helper initialization (
sample/src/main/java/com/example/sqlbrite/todo/db/Db.java) - Create a method in your Db class that calls briteDatabase.createQuery() with the table name and SELECT statement (
sample/src/main/java/com/example/sqlbrite/todo/db/Db.java) - Return an Observable<Query> that maps to your domain model using mapToList() or mapToOneOrDefault() (
sample/src/main/java/com/example/sqlbrite/todo/db/Db.java) - Subscribe to the Observable in your UI layer (Fragment/Activity) and call briteDatabase.setNotificationEnabled(true) on the affected tables (
sample/src/main/java/com/example/sqlbrite/todo/ui/ItemsFragment.java)
Add a new table mutation (insert/update/delete)
- Create a method in your Db class that calls briteDatabase.insert(), briteDatabase.update(), or briteDatabase.delete() (
sample/src/main/java/com/example/sqlbrite/todo/db/Db.java) - Wrap the operation in a briteDatabase.transaction() block if multiple table mutations must be atomic (
sample/src/main/java/com/example/sqlbrite/todo/db/Db.java) - The mutation automatically triggers notifications on the affected table, causing all subscribed queries to emit new results (
sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteDatabase.java)
Implement ContentResolver monitoring
- Obtain a BriteContentResolver instance by calling sqlBrite.wrapContentResolver() (
sqlbrite/src/main/java/com/squareup/sqlbrite3/SqlBrite.java) - Call briteContentResolver.createQuery() with a content URI to observe changes (
sqlbrite/src/main/java/com/squareup/sqlbrite3/BriteContentResolver.java) - Subscribe to the returned Observable to receive query results whenever the content provider notifies changes (
sqlbrite/src/androidTest/java/com/squareup/sqlbrite3/BriteContentResolverTest.java)
Add a Kotlin extension function
- Create an extension function in sqlbrite-kotlin/src/main/java/com/squareup/sqlbrite3/extensions.kt (
sqlbrite-kotlin/src/main/java/com/squareup/sqlbrite3/extensions.kt) - Provide a reusable Kotlin DSL wrapper around BriteDatabase or BriteContentResolver methods to reduce boilerplate (
sqlbrite-kotlin/src/main/java/com/squareup/sqlbrite3/extensions.kt) - Document the extension in the module's README for discovery by Kotlin users (
sqlbrite-kotlin/build.gradle)
🔧Why these technologies
- RxJava — Enables reactive stream semantics for query notifications and database changes, allowing automatic UI updates without polling
- SupportSQLiteOpenHelper (androidx.sqlite) — Standardized abstraction over SQLiteOpenHelper that works consistently across Android versions and supports AndroidX
- ContentProvider/ContentResolver — System-level contract for inter-process data sharing; BriteContentResolver makes provider notifications reactive
- Android Support Library v4 — Provides backward compatibility for annotations and base classes across API levels
- Kotlin — Enables concise extension functions and DSL for improved ergonomics without breaking Java compatibility
- Android Lint — Custom lint rules detect common SqlBrite mistakes (e.g., mismatched query placeholder counts) at compile-time
⚖️Trade-offs already made
-
Reactive queries automatically re-run when any mutation touches the observed tables
- Why: Simplifies reactive consistency; developers don't manually manage cache invalidation
- Consequence: Potential performance overhead if many queries observe the same heavily-mutated table; requires careful query optimization
-
Scheduler required at BriteDatabase creation time for all query emissions
- Why: Allows query work and notifications to run on chosen thread (e.g., IO), decoupling from main thread
- Consequence: Slightly more configuration overhead; must match Scheduler choice to app's threading model
-
Library is deprecated in favor of SQLDelight + Copper
- Why: SQLDelight provides compile-time SQL validation and code generation; Copper offers cleaner content provider monitoring
- Consequence: No new features will be added; projects should migrate to modern replacements for new code
-
BriteDatabase wraps SupportSQLiteOpenHelper rather than replacing it
- Why: Leverages existing SQLite abstraction; compatible with Room and other libraries that use the same base
- Consequence: Thin wrapper layer adds minimal overhead but means library doesn't handle schema migrations directly
🚫Non-goals (don't propose these)
- SQL query validation or compilation (not a compile-time tool)
- Schema migration management (delegated to the consuming app or Room)
- Real-time database synchronization across devices (local queries only)
- Automatic ORM or object mapping (consumers map manually or use Room)
- Support for synchronous blocking queries (
🪤Traps & gotchas
Deprecated library—using this in new projects will create technical debt. RxJava2 subscriptions must be manually disposed to avoid memory leaks (no RxJava3 compatibility). Requires explicit Scheduler parameter (e.g., Schedulers.io()) for query notifications; wrong scheduler choice can block main thread. AndroidX migration required if used in modern Android projects (current code uses old Support Library imports). Sample app uses debug.keystore for signing—remove before production release.
🏗️Architecture
💡Concepts to learn
- Reactive Streams / RxJava Observables — SqlBrite's entire design pivots on converting static SQL queries into hot Observables that emit new Query results on database mutations; understanding backpressure, subscription lifecycle, and scheduler threading is essential
- Table-level Change Notification Triggering — SqlBrite intercepts insert/update/delete operations and triggers re-execution of queries listening to those tables; this is the key mechanism enabling live data without polling
- Scheduler Threading Model — Queries execute on a background Scheduler (e.g., Schedulers.io()) to avoid blocking the main thread; choosing the wrong scheduler can cause UI jank or deadlocks
- Cursor & Query Execution Deferred — SqlBrite's Observable<Query> does not execute the SQL immediately; subscribers must call query.run() to get a Cursor, enabling lazy evaluation and reducing memory pressure
- ContentResolver Monitoring (Deprecated in SqlBrite) — SqlBrite originally supported ContentProvider queries via ContentResolver; understanding this pattern explains why Copper was spun out as a separate library
- Dependency Injection with Dagger2 — Sample app uses Dagger2 (TodoComponent, TodoModule) to manage BriteDatabase lifecycle and Scheduler selection; affects how subscriptions are scoped and disposed
🔗Related repos
cashapp/sqldelight— Official Square successor to SqlBrite for database operations; provides type-safe SQL generation and reactive queries with better compile-time guaranteescashapp/copper— Square's recommended replacement for SqlBrite's ContentProvider monitoring; provides reactive streams for content resolver queriesReactiveX/RxJava— Foundation library; SqlBrite uses RxJava2 Observables and Schedulers as the core abstraction for reactive streamsgoogle/android-architecture— Google's architectural guidance; shows modern MVVM/MVI patterns that evolved beyond SqlBrite's repository patternrealm/realm-java— Alternative reactive database library for Android with built-in change notifications, though with different paradigm (document-oriented vs relational)
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for sqlbrite-kotlin extension functions
The sqlbrite-kotlin/src/main/java/com/squareup/sqlbrite3/extensions.kt file exists but there are no corresponding test files visible in the kotlin module. Given this is a Kotlin wrapper around the core Java library, it needs dedicated tests to ensure the extension functions work correctly with RxJava2 and the Kotlin stdlib. This is especially important since the library is in maintenance mode and needs reliable test coverage.
- [ ] Create sqlbrite-kotlin/src/test/java/com/squareup/sqlbrite3/ directory structure
- [ ] Write unit tests for each extension function in extensions.kt (e.g., query mapping extensions, transaction extensions)
- [ ] Add test dependencies (junit, truth, mockito) to sqlbrite-kotlin/build.gradle
- [ ] Ensure tests validate Kotlin-specific features like extension receivers and coroutine integration if applicable
- [ ] Document test patterns in CONTRIBUTING.md with Kotlin-specific examples
Create GitHub Actions workflow to replace deprecated Travis CI
The .travis.yml file indicates the project uses Travis CI, which has been deprecated and replaced. Since this is a maintained Android library (even in maintenance mode), it needs a modern CI/CD pipeline. The current build.gradle shows support for gradle tasks and the repo has snapshot deployment scripts (.buildscript/deploy_snapshot.sh) that should run in CI. A GitHub Actions workflow would provide free, native GitHub integration and ensure the library continues to build correctly.
- [ ] Create .github/workflows/build.yml with Android build and test steps
- [ ] Add Java setup (currently targeting JDK 8+ based on gradle version 3.0.1)
- [ ] Configure Gradle build caching for faster CI runs
- [ ] Add step to run lint checks using the sqlbrite-lint module
- [ ] Create separate workflow for snapshot deployments (using gradle-mvn-push.gradle)
- [ ] Document the new CI setup in CONTRIBUTING.md and remove Travis CI references
Add integration tests for the sample todo app with database operations
The sample/src/main/java directory contains a full todo app implementation with Db.java, DbCallback.java, TodoItem.java, and UI components (TodoApp.java, Fragments). However, there are no visible integration tests validating the reactive database operations end-to-end. This would demonstrate the library's core value proposition and catch regressions. Tests should verify that query observables emit correctly when data changes.
- [ ] Create sample/src/androidTest/java/com/example/sqlbrite/todo/db/ directory
- [ ] Write integration tests for Db.java operations: insertTodoList(), insertTodoItem(), observing query updates
- [ ] Add instrumentation test dependencies to sample/build.gradle (AndroidJUnit4, Espresso if testing UI)
- [ ] Test that observable queries emit new values when underlying data changes via inserts/updates
- [ ] Add test documentation in CONTRIBUTING.md showing how to run the sample tests
- [ ] Validate the snapshot/rx behavior matches the README usage examples
🌿Good first issues
- Add Kotlin extension functions for common query patterns (e.g., db.queryList<T>() returning Observable<List<T>>) to reduce boilerplate in sample/src/main/java/com/example/sqlbrite/todo/
- Add integration tests for TodoItem and TodoList database operations in sample/src/test/ to verify Observable emissions on insert/update/delete
- Migrate sample app dependencies from Support Library v27 to AndroidX (update build.gradle and imports in sample/src/main/) and document the step-by-step process for users considering this upgrade
⭐Top contributors
Click to expand
Top contributors
- @JakeWharton — 78 commits
- [@Alec Strong](https://github.com/Alec Strong) — 8 commits
- @geralt-encore — 2 commits
- @gabrielittner — 2 commits
- @oldergod — 1 commits
📝Recent commits
Click to expand
Recent commits
d4cf6ef— Mention Copper (JakeWharton)3fe18b6— Merge pull request #253 from square/jakew/deprecate/2019-01-15 (JakeWharton)ca2dd5c— Deprecate (JakeWharton)42a0ef7— Merge pull request #249 from oldergod/bquenaudon/action-consumer (JakeWharton)3e83e29— Replaced Action1 by Consumer in README (oldergod)e235fde— Prepare next development version. (JakeWharton)2b6d872— Prepare version 3.2.0. (JakeWharton)317ee2d— Merge pull request #239 from kukuhyoniatmoko/master (JakeWharton)1e2f1c0— Add query(SupportSQLiteQuery) method (kukuhyoniatmoko)7a45c85— Prepare next development version. (JakeWharton)
🔒Security observations
The SqlBrite project has moderate security concerns primarily related to outdated dependencies containing known vulnerabilities, an incomplete build configuration, and the deprecated status without enforced maintenance. While the project itself is well-designed for security (preventing SQL injection through reactive abstractions), the outdated dependency versions pose significant risk. Immediate action is needed to update all dependencies or formally archive the project. The presence of a debug keystore and incomplete build file
- High · Outdated Dependencies with Known Vulnerabilities —
build.gradle, gradle.properties, build scripts. The project uses multiple outdated dependencies that may contain known security vulnerabilities. Notable outdated packages include: Gradle 3.0.1 (released 2018), Android Support Library 27.0.0 (outdated), Kotlin 1.1.60 (outdated), Dagger 2.13 (outdated), RxJava 2.1.3 (outdated), and ButterKnife 8.8.1 (outdated). These versions are significantly behind current releases and likely contain patched security issues. Fix: Update all dependencies to their latest stable versions. Specifically: upgrade Gradle build plugin to latest 4.x or 5.x, update Android Support libraries to AndroidX, upgrade Kotlin to latest LTS version, and update all third-party libraries to their current releases. Run 'gradle dependencyUpdates' to identify outdated packages. - High · Incomplete Build Configuration File —
build.gradle (end of file). The build.gradle file appears to be truncated or malformed. The 'publishV1Javadoc' task definition is incomplete with 'JavadocPublishe' appearing to be cut off. This suggests the configuration file may not be properly maintained or version controlled, potentially hiding other security-relevant configurations. Fix: Complete and validate the build.gradle configuration file. Ensure all task definitions are properly closed and the file is syntactically correct. Review version control history to identify when this corruption occurred. - Medium · Debug Keystore Included in Repository —
sample/debug.keystore. A debug keystore file (sample/debug.keystore) is present in the repository. While debug keystores are intended for development, their presence in version control can lead to accidental use in production builds or serve as a reference for key generation attacks. Fix: Remove the debug keystore from version control. Add '*.keystore' to .gitignore. Regenerate debug keystores locally on developer machines using keytool. Use secure key management practices for production keystores with restricted access. - Medium · Deprecated Project Status Not Enforced —
README.md, .travis.yml, build.gradle. The README indicates the library is deprecated and no longer actively developed, yet the build configuration and CI/CD still appear to be active. This creates a maintenance burden and security risk as dependencies will not be updated to patch vulnerabilities. Deprecated libraries should have clear warnings in documentation and dependency metadata. Fix: Publish clear deprecation notices in build.gradle gradle metadata and package repositories. Add deprecation annotations to Java code. Consider archiving the repository if no maintenance is planned. Update CI/CD configuration to skip automated builds or mark them as informational only. - Low · Missing Security Headers in Build Configuration —
build.gradle, gradle.properties. The Gradle build configuration does not include common security practices such as dependency verification, checksum validation, or security plugin integration (e.g., OWASP Dependency Check). Fix: Integrate dependency verification using Gradle's built-in verification feature. Add OWASP Dependency-Check or similar security scanning tools to the build process. Configure Gradle to verify dependency checksums and signatures. Add security scanning to CI/CD pipeline. - Low · Potential SQL Injection Risk Pattern —
sample/src/main/java/com/example/sqlbrite/todo/db/Db.java. While the codebase structure shows proper use of SQLite wrappers through SqlBrite abstraction, the presence of raw SQL queries in the todo sample application (particularly in Db.java) suggests developers may write unparameterized queries. The library's purpose is to prevent this, but proper training and code review are essential. Fix: Ensure all SQL queries use parameterized statements via the SqlBrite API. Implement code review processes to catch raw SQL strings. Add lint rules (present in sqlbrite-lint module) to detect and prevent unparameterized SQL queries in the sample and downstream projects.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.