Data Manager Classic

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).

Contents

Description

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:

Quick start

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.

Definition vs. data

Two ideas to keep apart:

Both live entirely on your device; nothing is sent to a server. To move or keep a copy elsewhere there are three ways: a backup of all databases in one file, Share definition for one database (with or without its data), and CSV transfer for the entries of one database.

Pro

Some of the app is Data Manager Pro, a one-time unlock — no subscription, no ads, no account. You can try it free for 14 days first; the trial starts only when you explicitly begin it, not on first launch.

Pro gates building and editing, never your data. What you built with Pro keeps working without it: calculated fields and roll-ups still compute, saved views and filters still load and apply, reminders still fire. Only the way to create or change such a thing is locked.

Pro covers:

Everything else — any number of databases, every field type, references, unique rules, encryption, CSV transfer, sharing definitions, and the backup of all databases — works without Pro. Locked entry points carry a padlock (🔒); tapping one opens the description with the price and the trial.

Creating a database

From scratch

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 examples

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.

Note: The Credit Cards, Passwords & PINs, and Secure Notes fixtures are templates for sensitive data. They ship without a password or encryption — you choose those. Set a database password and toggle the sensitive fields as encrypted before entering real data.

Editing a database

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 and a multi-line Description. Both are saved on focus loss. The description shows under the database name on the main Databases list and travels with shared definitions.

Tables list

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.

Appearance

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 & keep-position

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.

Editing a table

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, Add reference, or Add unique constraint. Tap Edit to reorder fields or swipe-delete them. Field order is also the order shown in the editor and in the row list.

References

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.

When picking a target row, the picker has a filter box at the top: type to narrow the list by the displayed value, with matches highlighted — handy for tables with many rows.

Unique constraints

A unique constraint requires that a field — or a combination of fields — is unique across the table's entries. Pick one field to make it unique on its own (e.g. an ISBN), or several for a compound key (e.g. first name + last name together). Tap + → Add unique constraint, check the member fields, and apply. Existing rules show as Field A + Field B cards with a delete button.

Enforcement is a warning, not a hard block — the editor saves field by field, so there's no single "save" to reject at:

Empty counts as a value, so a second blank entry on a unique field is flagged as a duplicate of the first. Encrypted fields can't be part of a unique constraint — their ciphertext isn't comparable — so marking a member field encrypted removes it from any rule.

Editing a field

Open Edit Table, then tap a field. Three sections: Name, Type (with type-specific options and the Encrypted toggle), and Display.

Field types

Each field has one of 19 types. Reference fields are managed from Edit Table (see above) and don't appear in the Type picker.

TypeWhat it storesNotes
TextFree-form textMultiline option; auto-correct toggle.
NumberInteger or decimalDecimals (0–8), thousands separator, hide-when-zero.
MoneyDecimal with currencyISO 4217 currency code (e.g. USD, EUR); 2 decimals; hide-when-zero.
Checkboxtrue / uncheckedEmpty value reads as unchecked.
ComboboxOne value from a listList configured as comma-separated values. Falls back to plain text while empty.
CounterInteger with +/− buttonsStart value; visible +/− in the row list.
DateCalendar date (UTC)Stored as yyyy-MM-dd. "Default to today" option.
TimeWall-clock timeStored as HH:mm. "Default to now" option; minute interval.
Date+TimeCalendar date + timeStored as yyyy-MM-ddTHH:mm. "Default to now"; minute interval.
ImageBare filenamePicked via the system photo picker; copied into app-private storage. Display size configurable.
LocationLatitude,longitude"Use current" requests coarse location; "Open in Maps" hands off to the system maps app.
Rating0–5 starsTap a star to set; tap the current value to clear.
SpinnerInteger in a rangeMin/max bounds; clamped on commit.
URLWeb URL"Open" button uses the system browser; rendered as a hyperlink in the row list.
EmailEmail address"Mail" button uses the system mail handler; hyperlink in the row list.
PhonePhone number"Call" button uses the system dialer; hyperlink in the row list.
ReferenceSnapshot of a peer-table valueCreated via Edit Table → Add reference. Read-only on rows.
Calculatednothing — computed liveA formula or text template over other fields. Pro. See Calculated fields.
Roll-upnothing — computed liveAggregates the rows that point at this one. Pro. See Roll-ups.

Type changes preserve existing stored values — switching a Number field to Text leaves the digits in place. The new type's default options apply.

Display flags

Calculated fields Pro

A Calculated field stores nothing — it recomputes every time it is shown. Reference other fields with {Field name}.

Because nothing is stored, the result follows its inputs the moment they change. Calculated fields cannot be typed into, cannot be the source of a reference, and cannot join a unique rule — in all three cases because there is no stored value to point at. A CSV export carries the results; an import skips them, since they are recomputed anyway.

Roll-ups Pro

A roll-up aggregates the rows that point at the current one. It therefore belongs on the table being referenced, not the one doing the referencing: if expenses point at a car, the roll-up lives on the cars and summarises the expenses. That is why the type picker offers it only where a suitable reference exists.

Three choices: the reference to aggregate over, the aggregate (count, sum, average, minimum, maximum) and — except for count — the field to aggregate. A filter can optionally narrow which rows are counted, to one year for instance.

Minimum and maximum also work over date fields and then yield a date — useful for "last serviced". A roll-up with no matching rows reads 0, or stays empty. Like a calculated field it is computed live and never stored.

Worth knowing: a reference connects to one target table, and a roll-up counts through exactly one reference. Where a table holds several references to the same target — fixed ingredient slots "Ingredient 1" to "Ingredient 6", say — a roll-up counts only the uses through the reference you picked, not across all of them.

Reminders Pro

Date and Date+Time fields can raise a reminder: the Remind switch in the field editor. The app notifies you on that day, at the reminder time you set.

Android checks once a day and catches up on days it missed — the device was off, say — up to a week back. Reminders already in the past are skipped. An encrypted field is never used as a notification's title.

Working with data

Add / edit / delete

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.

Filter

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.

Structured filters (Pro). The funnel icon ▽ in the toolbar opens a filter built from individual conditions — field, operator, value — rather than a plain text search. Match when joins them with All (AND) or Any (OR). A tick before a line negates that single condition; Invert result (NOT) negates the whole thing.

+ Group adds nested groups with their own connector, which is how "A and (B or C)" is expressed. Date fields additionally offer relative operators such as "in the last 7 days", re-evaluated against today each time the filter runs.

Encrypted fields can be filtered while the database is unlocked. Such conditions are not stored in a saved view, however — unless they need no value at all, like "is empty". That keeps plaintext out of a saved view and out of a shared definition.

Saved views Pro

A view records how the list looks right now: search text, filter, sort levels, grouping, and the totals field with its goal. Use ⋮ → Save current view…, give it a name, done. Saved views appear in the same menu and apply with a tap.

A view is a snapshot, not a live binding: applying it copies its settings into the current view. Change something afterwards and the saved view is untouched — Update from current view writes the new state into it.

Sort & group

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.

Totals & goal

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).

Goal. The totals field can carry a target; a progress bar then appears under the sum showing how much of it is reached. Goal counts chooses what it refers to: all entries in the list, or the current calendar month. A monthly goal needs a date field in the table to decide the month by. The grand total keeps its meaning throughout — the monthly figure appears beside it rather than replacing it. The goal is not a Pro feature.

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.

Statistics Pro

Reached from the ⋮ menu. Statistics reduces one table to a chart and asks four things: Group by (the field forming the groups), Metric (count, sum, average, minimum, maximum), a Value field for everything but count, and the Chart type: bar, pie or line.

When the group field is a date, a Period appears — day, month or year — to bucket the values by. A legend below the chart carries the numbers, formatted as the totals row formats them, so a money sum shows its currency here too.

Encrypted fields are not offered: equal contents encrypt to unequal ciphertext, so grouping would invent groups that do not exist.

Print & PDF Pro

⋮ → Print… hands the current list — with whatever the filter, sorting and grouping are doing — to the system print dialog. Layout offers Table or Cards, and you choose whether visible only or all fields appear. A single entry can be printed from its editor.

The system dialog offers "Save as PDF" in place of a printer, which is why the app needs no PDF export of its own.

Switching tables

If a database has more than one table, the database screen's title doubles as a table picker. Tap the table name to switch.

Security

From Edit Database, scroll to the Security section. Two stacked levels:

Password

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

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.

Important: Forgetting your password makes encrypted fields unreadable forever. There is no recovery, by design. Make CSV exports while you can still read the data, or write the password down somewhere safe.

Auto-lock timeout

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.

CSV transfer

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.

Share & import definitions

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.

Share

From the Databases screen, long-press a database (iOS) or use the row menu (Android) and tap Share definition…. Two toggles control what travels:

Unique constraints travel with the definition. Note that a bundle with many photos can get large, since each image is embedded.

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.

Import

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.

Backup

On Android the Backup section in the sidebar, on iPhone the Backup section in Preferences, offers two buttons: Back up all databases and Restore backup. The first writes every database into a single file — structure, entries, images and the links between tables. The system file picker decides where it lands: device storage, Drive, a cloud of your choosing. This is not a Pro feature.

Security is kept: encrypted fields stay ciphertext and the password travels as its hash. Nothing has to be unlocked to make a backup, and nothing can be read out of the file without the password.

Restore backup adds the databases it contains beside the existing ones — nothing is replaced and nothing is overwritten. The same file reads on Android and on iPhone; the format is identical on both.

Distinct from this is the operating system's automatic backup. On Android it carries the database and the settings; images stay out of it, because Google caps app data at 25 MB and discards the whole backup once it is over — a device-to-device transfer has no such cap and takes the images along. On iPhone the app's data, images included, is part of the iCloud or device backup. Either way the system backup restores only onto a device of the same platform; the complete, user-controlled backup that also crosses between Android and iPhone is the file from this section.

One known limit: images in an encrypted image field are not carried, as in any shared definition.

Preferences

Open the Preferences screen from the Databases toolbar:

Privacy

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.

Credits

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.