0

我是 iPhone 开发和 Mac OS 的新手,请多多包涵。但我努力深入,但找不到问题的解决方案。

我通过命令提示符在 sqlite 中创建了一个数据库。数据库保存在 Users/Dnamto/resources.db

但是当我尝试使用以下代码片段在我的 iPhone 应用程序中打开这个数据库时

// Get the documents directory
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    docsDir = [dirPaths objectAtIndex:0];

    // Build the path to the database file
    databasePath = [[NSString alloc]initWithString: [docsDir stringByAppendingPathComponent:@"resources.db"]];

数据库无法打开。应用程序正在搜索的数据库路径是:/Users/Dnamto/Library/Application Support/iPhone Simulator/6.0/Applications/C82C3DAF-4E95-49A7-9A4F-4D69B056DC9D/Documents/resources.db

谁能帮我获得正确的数据库路径。我们能否对 DB 路径进行硬编码,以便我的应用程序链接到它。如果是,请提供代码片段。

4

2 回答 2

1

你不能。在真实设备中,您无法获得硬编码路径。

你需要一个相对路径。

您的问题是您的数据库不在文档目录中。

您需要将数据库添加到主包中,并且在运行时需要检查 db 是否存在于文档目录中,如果没有,则需要使用NSFileManager.

您可以使用以下代码将数据库文件从捆绑包复制到文档目录。

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"resource.db"];
NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"resource.db"];
NSError *error;
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:folderPath error:&error];
于 2013-02-01T06:11:24.850 回答
1

在应用程序中添加您的数据库并检查 db 是否存在于 doc 目录中,如果没有,则需要将其复制到 doc 目录中然后访问它。对于 cppy doc 目录中的 db,请使用以下代码片段

- (void)copyDatabaseIfNeeded {

    BOOL success;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:[self getDBPath]];
    NSString *databasePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"dbname.sqlite"];
    if(success)
    {
        return;// remove old one.
    }
    [fileManager copyItemAtPath:databasePath toPath:[self getDBPath] error:nil];
}

要打开数据库,请使用以下代码片段

-(void)openDatabase
{
    @try
    {
        [self copyDatabaseIfNeeded];
        if(sqlite3_open([[self getDBPath] UTF8String], &mainDatabase)==SQLITE_OK)
        {
            NSLog(@"Database opened");
        }
    }
    @catch (NSException *exception)
    {
        NSLog(@"Exception in openDatabase %@ :%@",exception.name,exception.reason);
    }
}

- (NSString *)getDBPath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"dbname.sqlite"];
}

使用以下代码段关闭数据库。

-(void)closeDatabase:(sqlite3_stmt*)statement
{
    @try
    {
        sqlite3_finalize(statement);
        sqlite3_close(mainDatabase);
    }
    @catch (NSException *exception)
    {
        NSLog(@"Exception in DatabaseController closeDatabase %@ :%@",exception.name,exception.reason);
    }
}
于 2013-02-01T06:14:11.773 回答