应用程序在设备上运行时如何获取Sqlite数据库文件?

时间:2011-07-08 06:28:56

标签: iphone sqlite

我在设备上运行时遇到访问数据库文件的问题。我怎么能得到那个文件?在模拟器上运行应用程序时访问文件没有问题。就像我在模拟器上运行应用程序一样,DB文件位于:

/Users/Nitish/Library/Application Support/iPhone Simulator/4.3/Applications/1B787527-0608-4BC1-8022-DFDB3CC35F66/mysqlite.sqlite

在设备上运行应用程序时,我在哪里可以找到数据库文件?

8 个答案:

答案 0 :(得分:20)

阅读所有评论和回答,我认为没有人真正回答作者的简单问题:

如何在实际设备上运行时访问sqlite数据库文件(这在作者指示的iPhone模拟器中不是问题)

以下是我的工作:

  1. (一次!)确保Mac上显示所有隐藏文件: 在终端窗口运行: 默认写入com.apple.Finder AppleShowAllFiles是

  2. 在Xcode中,打开管理器 - >设备,找到你的iPhone,并在他们的应用程序文件夹中找到你的应用程序。

  3. 在底部单击“下载”并将应用程序下载到桌面(任何位置)

  4. 打开Finder,导航到下载的文件,右键单击它并选择Show Package Contents。视图将更改为标准查找程序视图,并在该应用程序中打开文件。

  5. 转到Documents文件夹,找到* .sqlite文件,右键单击它并选择Open With - >其他

  6. 选择SQLite数据库浏览器(http://sqlitebrowser.sourceforge.net)并通过数据库浏览器欣赏数据库视图。

  7. 一旦你完成一次,整个过程只需不到一分钟。

答案 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"];

这应该适用于设备和模拟器。