【问题标题】:Database not being found... iOS/SQLite找不到数据库... iOS/SQLite
【发布时间】:2012-05-04 17:24:07
【问题描述】:

我正在开发一个应用程序,该应用程序从文本字段中获取输入并将其放入字符串中。我有一个表,其中有一个字段,我想根据数据库中字段中的值检查输入中的字符串值。我是 iOS 新手,对 SQLite 也很陌生。

代码:

-(IBAction)setInput:(id)sender
{
NSString *strStoreNumber;
NSString *strRegNumber;

strStoreNumber = StoreNumber.text;
strRegNumber = RegNumber.text;
lblStoreNumber.text = strStoreNumber;
lblRegNumber.text = strRegNumber;

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
NSString* documentsDirectory = [paths lastObject];
//    NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"];
NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
{

    NSLog(@"Opened sqlite database at %@", databasePath);

    //...stuff
} 
else 
{
    NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database));
    sqlite3_close (database);
}

NSString *querystring;

// create your statement
querystring = [NSString stringWithFormat:@"SELECT strStore FROM tblStore WHERE strStore = %@;", strStoreNumber];  

const char *sql = [querystring UTF8String];

NSString *szStore = nil;
NSString *szReg = nil;


if (sqlite3_prepare_v2(database, sql, -1, &databasePath, NULL)!=SQLITE_OK) //queryString = Statement
{
    NSLog(@"sql problem occured with: %s", sql);
    NSLog(@"%s", sqlite3_errmsg(database));
}
else
{
    // you could handle multiple rows here

    while (sqlite3_step(databasePath) == SQLITE_ROW) // queryString = statement
    {            
        szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(databasePath, 0)];
        szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(databasePath, 1)];
    } // while        

}

sqlite3_finalize(databasePath);

// Do something with data...  
}

它到达“NSLog(@"Opened sqlite database at %@", databasePath);”行,所以它看起来好像可以访问数据库。但是,当我运行该应用程序时,我得到“NSLog(@"sql 问题发生在:%s", sql);"错误,我可以在控制台中看到。此外,在控制台中,它显示“没有这样的表:tblStore”。

我使用 Firefox 插件 SQLite 管理器创建了表。我将 sqlite3 库添加到项目中。我将在 SQLite 管理器中创建的数据库表拖放到我的项目中,在我的两个 AppDelegate 文件和我的两个 ViewController 文件上方。

任何帮助或输入将不胜感激。谢谢!

编辑:我已将文件正确添加到项目中,看起来好像现在找到了表。不过,现在我有一些奇怪的警告:

“不兼容的指针类型将'const char *'传递给'sqlite3_stmt *'类型的参数(又名'struct sqlite3_stmt *')”

此警告出现在以下代码行中:

if (sqlite3_prepare_v2(database, sql, -1, &databasePath, NULL)!=SQLITE_OK)

while (sqlite3_step(sql) == SQLITE_ROW)

szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(sql, 0)];

szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(sql, 1)];

sqlite3_finalize(sql);

它与“sql”有关,但我不确定是什么。有什么建议吗?

【问题讨论】:

  • 不是答案,但可能值得考虑 Core Data。
  • 感谢您的建议,但使用 CoreData 不是我的选择。我被指示使用 SQLite。谢谢!
  • 好吧,只是好奇,因为 Core Data 非常棒:) 顺便说一句,它确实允许您导入 sqlite 数据库。祝你好运。
  • 谁让你添加“;”在选择语句的末尾?你能显示真正的 nslog 输出而不仅仅是格式字符串吗?
  • 控制台吐出:2012-05-04 13:54:49.496 CCoDBTry[23306:f803] 在 /Users/MattHeld/Library/Application Support/iPhone Simulator/5.1/Applications/ 打开 sqlite 数据库5DB7A218-A0F6-485F-B366-91FD2F9BC062/Documents/tblStore.sqlite 2012-05-04 13:54:49.499 CCoDBTry[23306:f803] 出现 sql 问题:SELECT strStore FROM tblStore WHERE strStore = 8053; 2012-05-04 13:54:49.500 CCoDBTry[23306:f803] 没有这样的表:tblStore (lldb)

标签: ios sqlite


【解决方案1】:

您的代码似乎没问题 - 您是否将 db 复制到项目的 ressource 文件夹中?

编辑

确保您使用类似的方式访问您的 db 文件:

    - (void) initializeDB {

        // Get the database from the application bundle
        NSString* path = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];

        if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 
        {
            NSLog(@"Opening Database"); 
        }
        else
        {
            // Call close to properly clean up
            sqlite3_close(database);

            NSAssert1(0, @"Error: failed to open database: '%s'.", 
                      sqlite3_errmsg(database));
        }

}

【讨论】:

  • 你问这个很有趣。几个月前(4-5 个月)我曾经注意到一个资源文件夹,但自从更新 Xcode 后,我不再看到资源文件夹。我拖放了现有表(我在 Xcode 之外使用 Firefox 插件 SQLite 管理器创建的)并将其放到我的主文件夹中,其中包括我的 .xib、ViewController.h、ViewController.m、AppDelegate.h、和 AppDelegate.m
  • 对不起,我正在检查我的项目,其中包含一个资源文件夹,但这基本上是我自己创建的一个文件夹。您可以将数据库放在项目中的任何位置。只需确保在构建阶段/复制捆绑资源下单击您的项目时,您的文件已自动添加
  • 当我通过 Finder 查看我的项目文件夹时,我在我的项目文件夹中看到了我的 tblStore.sqlite。当我查看构建阶段>复制包时,我在 Xcode 中看不到 tblStore.sqlite 文件夹。这是我可能遇到麻烦的地方吗?我应该在复制包中添加 tblStore.sqlite 文件吗?感谢您的回复和帮助!非常感谢!
  • 另外,我编辑了我的原始代码并添加了你的行 "NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];"以及删除 "// NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"];"
  • 是的,只需将文件从 Finder 拖放到 XCode 并选择添加到目标选项,您应该会在 XCode 和复制包下看到该文件。
【解决方案2】:

您添加到项目中的数据库文件将嵌入主NSBundle(请参阅[NSBundle mainBundle])。

为了做您想做的事,您需要先将数据库从主包复制到文档文件夹,然后再尝试访问它。否则,正如您所遇到的,您将无法在文档文件夹中找到 SQLite DB。

【讨论】:

  • 您将不得不原谅我的无知,因为我对 iOS 还很陌生。您介意提供有关我如何完成此操作的步骤吗?或者至少提供一些我可以遵循的资源/教程?谢谢!
  • 我能够通过构建阶段将文件添加到包中>复制包资源。感谢您的帮助!
【解决方案3】:

您可以复制您的数据库,单击查找器并在查找器中写入此地址(/Users/administrator/Library/Application Support/iPhone Simulator/6.1/Applications/)单击确定。 您将获得文件路径。 打开您的项目文档文件并粘贴您的数据库....

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2017-01-08
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多