我在设备上运行时遇到访问数据库文件的问题。我怎么能得到那个文件?在模拟器上运行应用程序时访问文件没有问题。就像我在模拟器上运行应用程序一样,DB文件位于:
/Users/Nitish/Library/Application Support/iPhone Simulator/4.3/Applications/1B787527-0608-4BC1-8022-DFDB3CC35F66/mysqlite.sqlite
在设备上运行应用程序时,我在哪里可以找到数据库文件?
答案 0 :(得分:20)
阅读所有评论和回答,我认为没有人真正回答作者的简单问题:
如何在实际设备上运行时访问sqlite数据库文件(这在作者指示的iPhone模拟器中不是问题)
以下是我的工作:
(一次!)确保Mac上显示所有隐藏文件: 在终端窗口运行: 默认写入com.apple.Finder AppleShowAllFiles是
在Xcode中,打开管理器 - >设备,找到你的iPhone,并在他们的应用程序文件夹中找到你的应用程序。
在底部单击“下载”并将应用程序下载到桌面(任何位置)
打开Finder,导航到下载的文件,右键单击它并选择Show Package Contents。视图将更改为标准查找程序视图,并在该应用程序中打开文件。
转到Documents文件夹,找到* .sqlite文件,右键单击它并选择Open With - >其他
选择SQLite数据库浏览器(http://sqlitebrowser.sourceforge.net)并通过数据库浏览器欣赏数据库视图。
一旦你完成一次,整个过程只需不到一分钟。
答案 1 :(得分:11)
我使用此方法获取数据库的URL:
+ (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"]];
}
}
它在模拟器上,设备上甚至在执行单元测试时都能正常工作! UnitTests和Documents都应该存在于.xcodeproj的层次上。
答案 2 :(得分:5)
正如其他人所说,您的数据库不应位于应用程序的根文件夹中。如果要从捆绑包中加载静态数据库(即通过在xCode中添加数据库而预加载的数据库),则必须通过捆绑包访问它。
NSString *path = [[NSBundle mainBundle] pathForResource:@"mysqlite" ofType:@"sqlite"];
如果您从文档目录访问该文件(即已经修改或保存)。
NSString *fileName = @"mysqlite.sqlite";
NSString *directoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [directoryPath stringByAppendingPathComponent:fileName];
答案 3 :(得分:4)
您的数据库很可能位于apps文档目录中。因此,您需要使用以下命令调用该目录:
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
答案 4 :(得分:4)
@nitish:
我有一个代码,当应用程序在设备上运行时,它将访问sqlite数据库文件。
- (void) initDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory
stringByAppendingPathComponent:@"contacts.db"];
success = [fileManager fileExistsAtPath:writableDBPath];
dbpath = [writableDBPath UTF8String];
NSLog(@"path : %@", writableDBPath);
if (success) return;
// The writable database does not exist, so copy the default to the appropriate
// location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"contacts.db"];
success = [fileManager fileExistsAtPath:defaultDBPath];
//if(success) return;
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success)
{
NSAssert1(0, @"Failed to create writable database file with message '%@'.",[error localizedDescription]);
}
dbpath = [writableDBPath UTF8String];
NSLog(@"path : %@", writableDBPath);
}
"NSLog()"
将为您提供sqlite数据库文件的路径。它适用于模拟器和模拟器。设备。
希望它对你有用。
答案 5 :(得分:3)
由于我并不完全明白你要做什么,所以很有可能这不会很有帮助;如果这没用,请告诉我,我会将其删除。
如果您需要知道数据库的创建位置,也许您可以在生产环境中运行应用程序(即在某些iphone上)创建数据库,然后使用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
答案 6 :(得分:2)
签出数据库文件路径。这可能只是原因。
答案 7 :(得分:0)
做
NSString *dbFilePath=[NSHomeDirectory stringByAppendingPathComponent:@"mysqlite.sqlite"];
这应该适用于设备和模拟器。