Skip to content

Set temp_store_directory on Android #173

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open

Conversation

simolus3
Copy link
Contributor

SQLite tries to write some temporary data, such as large intermediate materialized views or indexes, to the file system. For this, it attempts to use paths in /tmp or the current working directory. Due to sandboxing, both directories are unavailable on Android though. This can cause errors that users were running into.

As a workaround, this overwrites the temporary directory to point to the cache directory from the app's Context.

@Test
fun canCreateTemporaryTable() = runTest {
database.execute("PRAGMA temp_store = 1;") // Store temporary data as files
database.execute("CREATE TEMP TABLE my_tbl (content ANY) STRICT;")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's worth noting that this test passes even without the pragma, but I'm not sure why. My understanding is that SQLite should use temporary files here, but it apparently doesn't.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe SQLite always keeps it in memory first, until it reaches a certain size threshold. I can't find any docs confirming this though.

Copy link
Contributor Author

@simolus3 simolus3 Apr 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've tried inserting a 1MiB randomblob 128 times, but it still seems to pass without setting the temp directory.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another thing to check is the Android version it is being tested on - I remember this potentially only affecting newer Android versions. Although I can't find where the test emulator is specified here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've just tested this manually with an SDK 35 emulator. An SDK-specific issue would surprise me though, we ship our own SQLite library along with the application. Or are you saying that some Android versions give apps their own /tmp that would be writable?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I think I'm remembering anecdotes of temporary storage issues only being present on some Android versions, but I don't think we ever confirmed that.

Either way it doesn't quite explain how these tests worked, unless the emulator uses different filesystem permission structures from actual devices?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unless the emulator uses different filesystem permission structures from actual devices?

That sounds unlikely, the emulator is a VM running a real Android system.

I think I'm remembering anecdotes of temporary storage issues only being present on some Android versions

I've asked the user reporting this to share the Android version they're using. Maybe it's not a problem on newer Android versions and that's why we didn't catch this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants