I am facing problem in accessing database file when I am running it on device. How can I get that file? There is no problem in accessing file when I am running application o
I use this method for getting the URL to a database:
+ (NSURL *)storeURL
{
if ([self isExecutingUnitTests])
{
NSString *directory = [[NSFileManager defaultManager] currentDirectoryPath];
return [NSURL fileURLWithPath:[directory stringByAppendingPathComponent:@"UnitTests/test-database.sqlite"]];
}
else
{
return [NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.sqlite"]];
}
}
It works fine on the simulator, on the device and even when executing unit tests! UnitTests and Documents should both exist on the level of the .xcodeproj.
Checkout your Database file path. this may only reason.
Reading all comments and answer, I think nobody actually answered simple question of the author:
How to access sqlite database file while runs on the actual device (it's not an issue in iPhone simulator as author indicated)
Here is what I do:
(once!) Make sure all hidden files are visible on your Mac: In terminal window run: defaults write com.apple.Finder AppleShowAllFiles YES
While in Xcode, open Organizer -> Devices, find your iPhone and from their find your application in Applications folder.
At the bottom click Download and download the application to your desktop (anywhere)
Open Finder, navigate to the downloaded file, right click on it and select Show Package Contents. The view will change to standard finder view with open files in that app.
Go to the Documents folder, find your *.sqlite file, right click on it and choose Open With -> Other
Select SQLite Database Browser (http://sqlitebrowser.sourceforge.net) and enjoy view of your database through database browser.
It takes less than a minute to run the whole process, once you do it once.
As I don't completely understand what you are trying to do there is a big chance this will not be very helpful; if this isn't helpful let me know and I'll delete it.
If you need to know where a db is created, perhaps you can created one while running the app in your production environment (ie on some iphone) and then retrieve the path using the database_list pragma:
[someone@somewhere ~]$ sqlite3 foobar.db
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> pragma database_list;
0|main|/home/someone/foobar.db
As others have said your database should not be within your application's root folder. If you are loading a static database from your bundle (i.e a database preloaded by adding it in xCode) you have to access it by the bundle.
NSString *path = [[NSBundle mainBundle] pathForResource:@"mysqlite" ofType:@"sqlite"];
If you are accessing the file from the documents directory (i.e it has been modified or saved).
NSString *fileName = @"mysqlite.sqlite";
NSString *directoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [directoryPath stringByAppendingPathComponent:fileName];
do
NSString *dbFilePath=[NSHomeDirectory stringByAppendingPathComponent:@"mysqlite.sqlite"];
this should work for both device and simulator.