User manual for the cross-platform relational database app for Android and iOS. Successor to Data Manager 1.7.x by VivaLV Software (HP webOS, 2012).
Data Manager Classic lets you build your own relational databases on a phone or tablet. You define the tables, the fields, and the references between tables; the app stores everything locally and never talks to a server. The current Android and iOS apps are a faithful port of the original 2012 webOS Data Manager 1.7.x by VivaLV Software, with modern UI and the same on-disk and CSV behaviours.
Highlights:
Open the app. The Databases screen is empty on first launch. Tap + in the toolbar:
Tap a database from the list to open it. Tap a row to edit it. Tap the gear icon to change the schema (rename, add/remove tables and fields). Swipe a row to delete it (with confirmation).
On first launch the app shows a short walkthrough — five pages covering tables/fields, references, the privacy model, and how to get started. Skip at any time. The walkthrough never shows again automatically, but you can replay it from Help → Show walkthrough.
Two ideas to keep apart:
Both live entirely on your device. CSV transfer is the only way to move data on or off; there is no cloud backup.
From the Databases screen, tap + → New database. Enter a name and tap Add. The new database opens with one default table (Table 1) and one default Text field (Field 1). Tap the gear to edit the schema.
From the Databases screen, tap + → From example. The 19 bundled fixtures are listed with a short description, the table layout, and the row count. Type into the filter field at the top to narrow the list by name, description, or table name.
Tap a card to add it to the selection (tap again to deselect). Use Select all in the toolbar to grab every visible card — pair it with the filter to quickly pick a category. The toolbar's Create button shows how many databases will be seeded; tap it to create them all in one go. You can edit the seeded databases freely — fixtures don't relink to a master copy.
The bundled fixtures cover most of the field types and reference patterns in one go and are the fastest way to learn the surface.
Tap the gear icon on the database screen to open Edit Database. The screen has four sections: Database, Tables, Security, and Appearance.
The Database section has the database name. Edit it; the change is saved on focus loss.
The Tables section lists every table with a tap target to open Edit Table. Tap Edit at the top of the form to enter reorder/delete mode (drag handles appear; left swipe shows Delete). Tap + in the toolbar to append a new table. Every database keeps at least one table; the app refuses to delete the last one.
Toggle Use custom appearance to enable per-database styling. While custom appearance is on:
The Database name color and Database note color swatches affect the row in the main Databases list (independent of the per-database appearance toggle).
Font sizes for the row's primary line and the secondary lines are set per database. Reasonable values are 14–20 for the first line and 12–16 for the rest.
Keep position after edit: when you save a row that may have moved (e.g. its sort key changed), the list scrolls back to the just-edited row. Off by default.
Open Edit Database, then tap a table to enter Edit Table. Two sections: Table (the name) and Fields (the list of fields).
Tap + in the toolbar to choose Add field or Add reference. Tap Edit to reorder fields or swipe-delete them. Field order is also the order shown in the editor and in the row list.
A reference is a connection from this table to another. Pick a peer table and one or more of its fields; the app creates a Reference field on the current table for each picked source field. When you edit a row and pick a target row, all sibling reference fields auto-fill from that target.
Example: in Books you have a reference to Authors. Each Book row picks one Author. The Author Name appears in each Book's row, and edits to the Author update every Book that points at them.
Reference fields are read-only on data rows — you pick the target, you don't type the value. They are searchable and sortable like normal fields. The encrypted flag is copied from the source field; toggling encryption on the source automatically flips dependents.
Open Edit Table, then tap a field. Three sections: Name, Type (with type-specific options and the Encrypted toggle), and Display.
Each field has one of 17 types. Reference fields are managed from Edit Table (see above) and don't appear in the Type picker.
| Type | What it stores | Notes |
|---|---|---|
| Text | Free-form text | Multiline option; auto-correct toggle. |
| Number | Integer or decimal | Decimals (0–8), thousands separator, hide-when-zero. |
| Money | Decimal with currency | ISO 4217 currency code (e.g. USD, EUR); 2 decimals; hide-when-zero. |
| Checkbox | true / unchecked | Empty value reads as unchecked. |
| Combobox | One value from a list | List configured as comma-separated values. Falls back to plain text while empty. |
| Counter | Integer with +/− buttons | Start value; visible +/− in the row list. |
| Date | Calendar date (UTC) | Stored as yyyy-MM-dd. "Default to today" option. |
| Time | Wall-clock time | Stored as HH:mm. "Default to now" option; minute interval. |
| Date+Time | Calendar date + time | Stored as yyyy-MM-ddTHH:mm. "Default to now"; minute interval. |
| Image | Bare filename | Picked via the system photo picker; copied into app-private storage. Display size configurable. |
| Location | Latitude,longitude | "Use current" requests coarse location; "Open in Maps" hands off to the system maps app. |
| Rating | 0–5 stars | Tap a star to set; tap the current value to clear. |
| Spinner | Integer in a range | Min/max bounds; clamped on commit. |
| URL | Web URL | "Open" button uses the system browser; rendered as a hyperlink in the row list. |
| Email address | "Mail" button uses the system mail handler; hyperlink in the row list. | |
| Phone | Phone number | "Call" button uses the system dialer; hyperlink in the row list. |
| Reference | Snapshot of a peer-table value | Created via Edit Table → Add reference. Read-only on rows. |
Type changes preserve existing stored values — switching a Number field to Text leaves the digits in place. The new type's default options apply.
From the database screen, tap the FAB to add a row. The Edit Entry screen lists all fields in their configured order. Each field type has a tailored editor (date pickers, photo picker, location capture, reference picker, etc.). Changes save on focus loss; navigating back is safe.
Tap any row in the list to open it for editing. Swipe left to delete (with confirmation). The Trash concept does not exist here — deletion is immediate and final, but you can always re-add the row.
Duplicate: long-press a row and tap Duplicate. A sibling row appears in the same table with every field value copied verbatim — references point at the same targets as the source, encrypted cells decrypt under the same passphrase, image fields share the same picture. The editor opens on the duplicate so you can tweak whatever differs.
Above the row list is a filter field. Type to narrow the list to rows where any searchable field contains the entered substring (case-insensitive). The matching substrings are highlighted. Tap × to clear.
Tap the sort icon (top right) to open the Sort sheet. Up to four sort levels — pick a sortable field for each, with Ascending/Descending. The "Group by Level 1" toggle, when on, draws a header above each value cluster of the first sort field.
Sort indicators appear on the toolbar icon: ↑ (single ascending), ↓ (single descending), ≡ (multi-level), with a trailing ⁎ when grouping is on.
Tap the ∑ icon to pick a numeric field to total. The chosen field's sum across the visible (post-filter) rows shows at the bottom of the screen. A muted second line under the sum lists min, max, avg, and n (the number of rows that contributed) whenever more than one row has a value — single-row selections stay sum-only since min/max/avg would just repeat the sum. With grouping on, each group shows its own subtotal (sum only, to keep the list compact).
Eligible field types: Number, Money, Counter, Spinner, Rating, Time. Time is summed in minutes and rendered as H:MM. Averages on Counter/Spinner/Rating fields always render with at least two decimal places, so a meaningful fractional mean isn't rounded away.
If a database has more than one table, the database screen's title doubles as a table picker. Tap the table name to switch.
From Edit Database, scroll to the Security section. Two stacked levels:
A password locks reading and writing of the database. The lock screen blocks until the right password is entered. The hash layout is [16-byte salt][SHA-512(salt || password)] — verifying the password is constant-time. There is no recovery: forgetting the password means the database stays locked.
Buttons:
Encryption protects individual cell values, not the whole database file. Available after a password is set. A separate passphrase derives the cell key (Blowfish/CBC, 128-bit key, 8-byte IV per cell). The passphrase itself is wrapped under a key derived from your password — only the right password unwraps it.
Once encryption is enabled on the database, individual fields can be marked Encrypted from Edit Field. Toggling encryption on a field re-encrypts the existing values in place. Encrypted fields automatically have Searchable and Sortable forced off — ciphertext is opaque to the in-memory filter and compare paths.
To disable encryption, every field in the database must first be unmarked Encrypted (the corresponding values are decrypted in place). Disable Encryption then drops the wrapped passphrase.
Set the global lock-after-inactivity timeout from the Preferences screen (Lock after: Never / 1 / 5 / 15 / 30 / 60 minutes). When the timeout passes since the last successful unlock, the database lazily relocks on the next read. Killing the app always relocks immediately, regardless.
Open a database, then tap the ⇄ icon in the toolbar to reach the Transfer screen. The wire format matches the 2012 webOS original — ||Tablename|| markers, ;-separated cells, double-quotes for cells containing the separator/quotes/newlines, with embedded quotes doubled (""). Newlines in output are CRLF; CR/LF/CRLF are all accepted on input.
Three transports each direction:
The Encrypted mode toggle changes how encrypted fields cross the wire:
Import adds rows; it never modifies existing rows or schema. Tables are matched by name; unknown tables are skipped (the result message lists how many). Field names that don't match are listed in the result message but the rest of the row imports.
You can share an entire database — schema and optionally rows — as a portable file. Recipients open the file with Data Manager Classic and it appears as a new database in their list. The wire format is webOS-compatible when only the schema is shared.
From the Databases screen, long-press a database (iOS) or use the row menu (Android) and tap Share definition…. Two toggles control what travels:
Tap Copy to clipboard for an inline paste, or Prepare share… → Share… to send as a file through the system share sheet (AirDrop, Mail, Files, etc.).
If the database is locked and you turn Include data on while Remove password & encryption is also on, the app asks for the password — it needs to read the encrypted values in order to scrub them before sharing.
From the Databases screen, tap + → Import definition. Two sources:
The imported database joins the list with a fresh ID — it never replaces an existing entry. If the file was shared with Include data off, the new database arrives schema-only and you fill in rows.
Open the Preferences screen from the Databases toolbar:
The app stores everything locally and makes no network requests. Permissions are requested only on demand: coarse location when you tap "Use current" on a Location field, and photo library / image picker when you attach an image. No analytics, no advertising, no tracking. See the privacy policy for details.
Data Manager Classic is the modern successor to Data Manager 1.7.x by VivaLV Software (HP webOS, 2012). The "Classic" suffix differentiates the App Store listing from another developer's app while preserving the line of succession from the original. Both the Android port (Kotlin + Jetpack Compose + Room) and the iOS port (Swift + SwiftUI + GRDB) preserve the original on-disk schema and CSV wire format so users can move data between platforms.
The original webOS manual is preserved verbatim in the source tree at docs/vivalv/Database Manager.txt and remains the tiebreaker for behaviour questions.