Skip to content

Amplify datastore is not using sqlite #14440

@richstimson

Description

@richstimson

Before opening, please confirm:

JavaScript Framework

React Native

Amplify APIs

DataStore

Amplify Version

v6

Amplify Categories

storage

Backend

Amplify CLI

Environment information

# Put output below this line

% npx envinfo --system --binaries --browsers --npmPackages --duplicates --npmGlobalPackages



  System:
    OS: macOS 15.5
    CPU: (14) arm64 Apple M4 Pro
    Memory: 288.52 MB / 24.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 20.12.0 - /usr/local/bin/node
    npm: 10.5.0 - /usr/local/bin/npm
    Watchman: 2025.05.19.00 - /opt/homebrew/bin/watchman
  Browsers:
    Chrome: 137.0.7151.120
    Safari: 18.5
  npmPackages:
    @aws-amplify/datastore-storage-adapter: ^2.0.30 => 2.1.84 
    @aws-amplify/react-native: ^1.1.10 => 1.1.10 
    @aws-amplify/ui-react-native: ^2.2.13 => 2.5.1 
    @aws-sdk/client-cognito-identity-provider: ^3.677.0 => 3.787.0 
    @aws-sdk/client-eventbridge: ^3.749.0 => 3.787.0 
    @aws-sdk/client-lambda: ^3.734.0 => 3.787.0 
    @aws-sdk/client-location: ^3.665.0 => 3.787.0 
    @aws-sdk/client-scheduler: ^3.750.0 => 3.787.0 
    @aws-sdk/client-ses: ^3.758.0 => 3.787.0 
    @aws-sdk/client-sns: ^3.696.0 => 3.787.0 
    @aws-sdk/credential-providers: ^3.678.0 => 3.787.0 
    @azure/core-asynciterator-polyfill: ^1.0.2 => 1.0.2 
    @babel/core: ^7.20.0 => 7.26.10 
    @babel/plugin-transform-class-static-block: ^7.26.0 => 7.26.0 
    @expo/vector-icons: ^14.0.2 => 14.1.0 
    @react-native-async-storage/async-storage: 1.23.1 => 1.23.1 
    @react-native-clipboard/clipboard: ^1.16.1 => 1.16.2 
    @react-native-community/netinfo: 11.3.1 => 11.3.1 
    @react-native-picker/picker: 2.7.5 => 2.7.5 
    @react-navigation/native: ^6.0.2 => 6.1.18 
    @types/jest: ^29.5.12 => 29.5.14 
    @types/react: ~18.2.45 => 18.2.79 
    @types/react-native-vector-icons: ^6.4.18 => 6.4.18 
    @types/react-test-renderer: ^18.0.7 => 18.3.1 
    @types/xml2js: ^0.4.14 => 0.4.14 
    HelloWorld:  0.0.1 
    aws-amplify: ^6.15.1 => 6.15.1 
    aws-amplify/adapter-core:  undefined ()
    aws-amplify/adapter-core/internals:  undefined ()
    aws-amplify/analytics:  undefined ()
    aws-amplify/analytics/kinesis:  undefined ()
    aws-amplify/analytics/kinesis-firehose:  undefined ()
    aws-amplify/analytics/personalize:  undefined ()
    aws-amplify/analytics/pinpoint:  undefined ()
    aws-amplify/api:  undefined ()
    aws-amplify/api/internals:  undefined ()
    aws-amplify/api/server:  undefined ()
    aws-amplify/auth:  undefined ()
    aws-amplify/auth/cognito:  undefined ()
    aws-amplify/auth/cognito/server:  undefined ()
    aws-amplify/auth/enable-oauth-listener:  undefined ()
    aws-amplify/auth/server:  undefined ()
    aws-amplify/data:  undefined ()
    aws-amplify/data/server:  undefined ()
    aws-amplify/datastore:  undefined ()
    aws-amplify/in-app-messaging:  undefined ()
    aws-amplify/in-app-messaging/pinpoint:  undefined ()
    aws-amplify/push-notifications:  undefined ()
    aws-amplify/push-notifications/pinpoint:  undefined ()
    aws-amplify/storage:  undefined ()
    aws-amplify/storage/s3:  undefined ()
    aws-amplify/storage/s3/server:  undefined ()
    aws-amplify/storage/server:  undefined ()
    aws-amplify/utils:  undefined ()
    babel-preset-expo: ~11.0.0 => 11.0.15 
    blob-polyfill: ^9.0.20240710 => 9.0.20240710 
    expo: ~51.0.28 => 51.0.39 
    expo-asset: ~10.0.10 => 10.0.10 
    expo-build-properties: ~0.12.5 => 0.12.5 
    expo-constants: ~16.0.2 => 16.0.2 
    expo-dev-client: ~4.0.27 => 4.0.29 
    expo-file-system: ~17.0.1 => 17.0.1 
    expo-font: ~12.0.9 => 12.0.10 
    expo-linking: ~6.3.1 => 6.3.1 
    expo-location: ~17.0.1 => 17.0.1 
    expo-router: ~3.5.23 => 3.5.24 
    expo-splash-screen: ~0.27.7 => 0.27.7 
    expo-sqlite: ~14.0.6 => 14.0.6 
    expo-status-bar: ~1.12.1 => 1.12.1 
    expo-system-ui: ~3.0.7 => 3.0.7 
    expo-task-manager: ~11.8.2 => 11.8.2 
    expo-web-browser: ~13.0.3 => 13.0.3 
    fast-xml-parser: ^5.2.1 => 5.2.1 (4.5.3, 4.4.1)
    firebase: ^11.9.1 => 11.9.1 
    firebase/ai:  undefined ()
    firebase/analytics:  undefined ()
    firebase/app:  undefined ()
    firebase/app-check:  undefined ()
    firebase/auth:  undefined ()
    firebase/auth/cordova:  undefined ()
    firebase/auth/web-extension:  undefined ()
    firebase/compat:  undefined ()
    firebase/compat/analytics:  undefined ()
    firebase/compat/app:  undefined ()
    firebase/compat/app-check:  undefined ()
    firebase/compat/auth:  undefined ()
    firebase/compat/database:  undefined ()
    firebase/compat/firestore:  undefined ()
    firebase/compat/functions:  undefined ()
    firebase/compat/installations:  undefined ()
    firebase/compat/messaging:  undefined ()
    firebase/compat/performance:  undefined ()
    firebase/compat/remote-config:  undefined ()
    firebase/compat/storage:  undefined ()
    firebase/data-connect:  undefined ()
    firebase/database:  undefined ()
    firebase/firestore:  undefined ()
    firebase/firestore/lite:  undefined ()
    firebase/functions:  undefined ()
    firebase/installations:  undefined ()
    firebase/messaging:  undefined ()
    firebase/messaging/sw:  undefined ()
    firebase/performance:  undefined ()
    firebase/remote-config:  undefined ()
    firebase/storage:  undefined ()
    firebase/vertexai:  undefined ()
    gpxparser: ^3.0.8 => 3.0.8 
    jest: ^29.2.1 => 29.7.0 
    jest-expo: ~51.0.3 => 51.0.4 
    react: 18.2.0 => 18.2.0 
    react-dom: 18.2.0 => 18.2.0 
    react-native: 0.74.5 => 0.74.5 
    react-native-exit-app: ^2.0.0 => 2.0.0 
    react-native-gesture-handler: ~2.16.1 => 2.16.2 
    react-native-get-random-values: ~1.11.0 => 1.11.0 
    react-native-keyboard-aware-scroll-view: ^0.9.5 => 0.9.5 
    react-native-maps: ~1.18.0 => 1.18.0 
    react-native-paper: ^5.12.5 => 5.13.1 
    react-native-picker-select: ^9.3.1 => 9.3.1 
    react-native-reanimated: ~3.10.1 => 3.10.1 
    react-native-safe-area-context: 4.10.5 => 4.10.5 
    react-native-screens: 3.31.1 => 3.31.1 
    react-native-sqlite-storage: ^6.0.1 => 6.0.1 
    react-native-svg: 15.2.0 => 15.2.0 
    react-native-vector-icons: ^10.2.0 => 10.2.0 
    react-native-web: ~0.19.10 => 0.19.13 
    react-test-renderer: 18.2.0 => 18.2.0 
    typescript: ~5.3.3 => 5.3.3 
    xml2js: ^0.6.2 => 0.6.2 (0.6.0)
  npmGlobalPackages:
    @aws-amplify/cli: 12.13.1
    corepack: 0.25.2
    eas-cli: 16.6.2
    expo-cli: 6.3.10
    firebase-tools: 14.7.0
    npm-check-updates: 17.1.13
    npm: 10.5.0
    react-devtools: 6.1.1

Describe the bug

Using a clean install of the example project here:

https://docs.amplify.aws/gen1/react-native/build-a-backend/more-features/datastore/set-up-datastore/#setup-local-development-environment

Amplify DataStore stores the database in Async Storage rather than Sqlite on the Android mobile phone.

Expected behavior

I want the database to be stored in sqlite. In my real app, I have many thousands of records which won't work well with Async storage.

Reproduction steps

Ref: https://docs.amplify.aws/gen1/react-native/build-a-backend/more-features/datastore/set-up-datastore/

% npx create-expo-app AmplifyDataStoreExpo
% cd AmplifyDataStoreExpo
% npx expo install aws-amplify @aws-amplify/react-native @react-native-community/netinfo @aws-amplify/datastore-storage-adapter react-% % native-sqlite-storage @react-native-async-storage/async-storage react-native-get-random-values @azure/core-asynciterator-polyfill

% npm install

% npx expo start --dev-client

% npx expo install expo-linking

% npm run reset-project

% npx expo run:android

% amplify init // Gen 1

% amplify add api

% npm install aws-amplify

Add to schema.graphql:

type Post @model {
  id: ID!
  title: String!
  status: PostStatus!
  rating: Int
  content: String
}

enum PostStatus {
  ACTIVE
  INACTIVE
}

% npx amplify-app

% amplify codegen models

Updated app/index.tsx - see 'Code snippet' section of this issue.

Error:

Android Bundling failed 1896ms node_modules/expo-router/entry.js (2026 modules)
Unable to resolve "../dist/aws-amplify-datastore-sqlite-adapter-expo.min.js" from "node_modules/@aws-amplify/datastore-storage-adapter/ExpoSQLiteAdapter/index.js"

package.json:

Tried default/latest:
"@aws-amplify/datastore-storage-adapter": "^2.1.84",
Also reverted to this version as per #12801
"@aws-amplify/datastore-storage-adapter": "^2.0.30",

Fixed various build errors with:

% rm -rf node_modules
% npm install

% cp node_modules/@aws-amplify/datastore-storage-adapter/dist/umd/* node_modules/@aws-amplify/datastore-storage-adapter/dist
% npx expo install expo-sqlite
% npx expo install @aws-amplify/core

% npx expo prebuild
% npx expo start -c
% npx expo run:android
% rm -rf node_modules package-lock.json yarn.lock

Code Snippet

// Put your code below this line.

// index.tsx
// Configures Amplify DataStore to use SQLITE adapter
// Saves and queries an entry
// Logs both document director (which should store SQL .db files and Async storage

import { ExpoSQLiteAdapter } from "@aws-amplify/datastore-storage-adapter/ExpoSQLiteAdapter";
import "@azure/core-asynciterator-polyfill";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { DataStore } from "aws-amplify/datastore";
import * as FileSystem from "expo-file-system";
import React, { useEffect, useState } from "react";
import { Button, Platform, Text, View } from "react-native";
import { Post } from "../src/models"; // Adjust path if needed

// Configure DataStore before rendering the app
DataStore.configure({
storageAdapter: ExpoSQLiteAdapter,
});

async function logDataStoreDbSize() {
if (Platform.OS === "android") {
const dbPath = ${FileSystem.documentDirectory}datastore/AmplifyDatastore.db;
const info = await FileSystem.getInfoAsync(dbPath);
if (info.exists) {
console.log(DataStore DB size: ${info.size} bytes);
} else {
console.log("DataStore DB file does not exist at:", dbPath);
}
}
}

async function logAllFilesRecursively(
dir: string = FileSystem.documentDirectory ?? "",
prefix = ""
) {
try {
const safeDir = dir ?? "";
const items = await FileSystem.readDirectoryAsync(safeDir);
for (const item of items) {
const path = safeDir + item;
const info = await FileSystem.getInfoAsync(path);
if (info.isDirectory) {
await logAllFilesRecursively(path + "/", prefix + item + "/");
} else {
if (info.exists) {
console.log(File: ${prefix}${item}, size: ${info.size} bytes);
} else {
console.log(File: ${prefix}${item} does not exist);
}
}
}
} catch (e) {
console.log(Error reading directory ${dir}:, e);
}
}

async function logAllAsyncStorageKeysAndValues() {
try {
const keys = await AsyncStorage.getAllKeys();
console.log("All AsyncStorage keys:", keys);
for (const key of keys) {
const value = await AsyncStorage.getItem(key);
console.log(Key: ${key}\nValue: ${value}\n);
}
} catch (e) {
console.error("Error reading AsyncStorage:", e);
}
}

const onPressFabUserOne = async () => {
console.log("onPressFabUserOne()");
console.log(
"DBG: DOCUMENT DIR (INC SQLITE) ------------------------------------"
);
await logAllFilesRecursively();
await logDataStoreDbSize();
console.log("DBG: ASYNC STORAGE ------------------------------------");
await logAllAsyncStorageKeysAndValues();
};

export default function Index() {
const [message, setMessage] = useState("Loading...");

useEffect(() => {
async function saveAndQueryPosts() {
try {
// Save a new post
const post = await DataStore.save(
new Post({
title: "My First Post",
status: "ACTIVE", // or use a valid PostStatus value
})
);
console.log("Post saved successfully!", post);

    // Query all posts
    const posts = await DataStore.query(Post);
    console.log(
      "Posts retrieved successfully!",
      JSON.stringify(posts, null, 2)
    );
    setMessage(`Saved and retrieved ${posts.length} post(s)!`);
  } catch (error) {
    setMessage("Error saving or retrieving posts");
    console.log("Error saving or retrieving posts", error);
  }
}
saveAndQueryPosts();

}, []);

return (

{message}


);
}


Log output

// Put your logs below this line

DBG: DOCUMENT DIR (INC SQLITE) ------------------------------------
index.tsx:45 File: rList, size: 84 bytes
index.tsx:45 File: profileInstalled, size: 24 bytes
index.tsx:45 File: DevLauncherApp-BridgelessReactNativeDevBundle.js, size: 9611836 bytes
index.tsx:26 DataStore DB file does not exist at: file:///data/user/0/com.richstimson.AmplifyDataStoreExpo/files/datastore/AmplifyDatastore.db


index.tsx:76 DBG: ASYNC STORAGE ------------------------------------
index.tsx:59 All AsyncStorage keys: Array(10)
index.tsx:62 Key: @AmplifyDatastore::datastore_Setting::Data::01JY99EP9B15Z4J526J50ANET6::01JY99ED0ZSTATD7YHCA2BXTZS
Value: {"key":"schemaVersion","value":"\"066d19b25220b01d17dc20ce323843c6\"","id":"01JY99ED0ZSTATD7YHCA2BXTZS"}

index.tsx:62 Key: @AmplifyDatastore::sync_ModelMetadata::Data::01JY9AGWHQQ2AX9C67JAYFHCRF::01JY9AGCBEWNG1N3M97J18MEMV
Value: {"model":"Todo","namespace":"user","lastSync":null,"fullSyncInterval":86400000,"lastFullSync":null,"lastSyncPredicate":null,"id":"01JY9AGCBEWNG1N3M97J18MEMV"}

index.tsx:62 Key: @AmplifyDatastore::sync_ModelMetadata::Data::01JY9AGWJDGQCYMEKKATFRF9SA::01JY9AGCBEWNG1N3M97J18MEMW
Value: {"model":"Post","namespace":"user","lastSync":null,"fullSyncInterval":86400000,"lastFullSync":null,"lastSyncPredicate":null,"id":"01JY9AGCBEWNG1N3M97J18MEMW"}

index.tsx:62 Key: @AmplifyDatastore::sync_ModelMetadata::Data::01JY9AGXK5MCNZNP8MD3VN1HS0::01JY9AGCBEWNG1N3M97J18MEMW
Value: {"model":"Post","namespace":"user","lastSync":1750512203173,"fullSyncInterval":86400000,"lastFullSync":1750512203173,"lastSyncPredicate":null,"id":"01JY9AGCBEWNG1N3M97J18MEMW"}

index.tsx:62 Key: @AmplifyDatastore::sync_ModelMetadata::Data::01JY9AGXM25R181YZPBJ2QK9JY::01JY9AGCBEWNG1N3M97J18MEMV
Value: {"model":"Todo","namespace":"user","lastSync":1750512203173,"fullSyncInterval":86400000,"lastFullSync":1750512203173,"lastSyncPredicate":null,"id":"01JY9AGCBEWNG1N3M97J18MEMV"}

index.tsx:62 Key: @AmplifyDatastore::user_Post::Data::01JY99EPAQ9Q982KQ4YMVSE3C2::bb34139d-6cd6-405e-9555-a1b719c8a61f
Value: {"title":"My First Post","status":"ACTIVE","id":"bb34139d-6cd6-405e-9555-a1b719c8a61f","rating":null,"content":null,"createdAt":null,"updatedAt":null}

index.tsx:62 Key: @AmplifyDatastore::user_Post::Data::01JY9AAV3HKF855D2E6NZPKNVM::aed21185-37ac-4018-8e83-1bd756ab582d
Value: {"title":"My First Post","status":"ACTIVE","id":"aed21185-37ac-4018-8e83-1bd756ab582d","rating":null,"content":null,"createdAt":null,"updatedAt":null}

aws-exports.js

const awsmobile = {
    "aws_project_region": "us-east-1",
    "aws_appsync_graphqlEndpoint": "https://dpgggcvmczgsvjo4prd6xrv6ei.appsync-api.us-east-1.amazonaws.com/graphql",
    "aws_appsync_region": "us-east-1",
    "aws_appsync_authenticationType": "API_KEY",
    "aws_appsync_apiKey": "da2-rhoriwaiwnfrxjazzeavlqo3yy"
};

Manual configuration

No response

Additional configuration

No response

Mobile Device

Samsung Galaxy A05

Mobile Operating System

Android 14

Mobile Browser

N/A

Mobile Browser Version

N/A

Additional information and screenshots

package.json:

{
"name": "amplifydatastoreexpo",
"main": "expo-router/entry",
"version": "1.0.0",
"scripts": {
"start": "expo start",
"reset-project": "node ./scripts/reset-project.js",
"android": "expo run:android",
"ios": "expo run:ios",
"web": "expo start --web",
"lint": "expo lint",
"amplify-modelgen": "node amplify/scripts/amplify-modelgen.js",
"amplify-push": "node amplify/scripts/amplify-push.js"
},
"dependencies": {
"@aws-amplify/datastore-storage-adapter": "2.0.30",
"@aws-amplify/react-native": "^1.1.10",
"@azure/core-asynciterator-polyfill": "^1.0.2",
"@expo/vector-icons": "^14.1.0",
"@react-native-async-storage/async-storage": "2.1.2",
"@react-native-community/netinfo": "11.4.1",
"@react-navigation/bottom-tabs": "^7.3.10",
"@react-navigation/elements": "^2.3.8",
"@react-navigation/native": "^7.1.6",
"aws-amplify": "^6.15.1",
"expo": "~53.0.12",
"expo-blur": "~14.1.5",
"expo-constants": "~17.1.6",
"expo-dev-client": "~5.2.1",
"expo-font": "~13.3.1",
"expo-haptics": "~14.1.4",
"expo-image": "~2.3.0",
"expo-linking": "~7.1.5",
"expo-router": "~5.1.0",
"expo-splash-screen": "~0.30.9",
"expo-status-bar": "~2.2.3",
"expo-symbols": "~0.4.5",
"expo-system-ui": "~5.0.9",
"expo-web-browser": "~14.2.0",
"react": "19.0.0",
"react-dom": "19.0.0",
"react-native": "0.79.4",
"react-native-gesture-handler": "~2.24.0",
"react-native-get-random-values": "~1.11.0",
"react-native-reanimated": "~3.17.4",
"react-native-safe-area-context": "5.4.0",
"react-native-screens": "~4.11.1",
"react-native-sqlite-storage": "^6.0.1",
"react-native-web": "~0.20.0",
"react-native-webview": "13.13.5",
"expo-sqlite": "~15.2.12",
"@expo/metro-runtime": "~5.0.4"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@types/react": "~19.0.10",
"eslint": "^9.25.0",
"eslint-config-expo": "~9.2.0",
"typescript": "~5.8.3",
"ini": "^1.3.5",
"inquirer": "^6.5.1"
},
"private": true
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    DataStoreRelated to DataStore categoryquestionGeneral question

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions