4

我正在尝试从 sqlite 数据库中读取数据并将其显示在 ios 应用程序的表视图中。但由于某种原因,我无法打开 sqlite 数据库,并且应用程序崩溃并显示消息 - 无法打开数据库。

我使用 Firefox sqlite 管理器创建了数据库并将文件复制到 Xcode 项目中。

这是我的代码 -

-(NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:kFilename];
}

我正在尝试使用 viewDidLoad 中的 sqlite3_open_v2 命令打开数据库

sqlite3 *database;

    if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
        sqlite3_close(database); // not sure you need to close if the open failed
        NSAssert(0, @"Failed to open database");
    }
4

2 回答 2

13

这就是我打开数据库的方式。我已经很久没有做 SQLite 了,除了提供我在自己的应用程序中使用的代码之外,我无法给你太多帮助。这是我在我的应用程序中使用的一个类。

static sqlite3 *database;
static sqlite3_stmt *enableForeignKey;

@implementation DBAdapter

+ (sqlite3 *)sharedInstance {

    if (database == NULL) {
        sqlite3 *newDBconnection;

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"klb_db.sqlite"];

        if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) {   
            //NSLog(@"Database Successfully Opened :)");
            database = newDBconnection;

            if (sqlite3_prepare_v2(database, "PRAGMA foreign_keys = ON", -1, &enableForeignKey, NULL) != SQLITE_OK) {
                NSLog(@"ERROR IN PRAGMA!");
            }

            sqlite3_finalize(enableForeignKey);

        } else {
            NSLog(@"Error in opening database :(");
            database = NULL;
        }
    }

    return database;
}
于 2012-06-28T20:29:30.487 回答
3

我是否正确假设您的问题在我们讨论ios-sqlite 准备语句的评论中得到了回答?也就是说,我们要确保数据库包含在包中(通过在 Xcode 中为您的目标的“构建阶段”确认“复制包资源”设置)并且您希望您的应用程序检查数据库的存在在您的文档文件夹中,如果它不存在,您会将其从捆绑包 ( [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:kFilename]) 复制到您的文档文件夹。

这可能超出了您最初问题的范围,但是当您考虑最终部署您的应用程序,更重要的是,您的应用程序的后续升级/发布时,您可能希望将一些表添加到您的数据库中,其中包含一些内部数据库版本号您可以使用它来确定用户在其文档文件夹中拥有的数据库版本,并对该数据库进行任何您可能需要的修改以支持您的应用程序的最新版本。只是一个想法。

无论如何,如果您仍有任何未解决的问题,请告诉我们。否则我会假设我们已经解决了你的问题。

于 2012-06-29T00:35:06.217 回答