找不到数据库... iOS / SQLite

时间:2012-05-04 17:24:08

标签: ios sqlite

我正在开发一个应用程序,它从文本字段中获取输入并将其放入字符串中。我有一个表中包含一个字段的表,我想根据输入中的字符串值检查数据库中字段的值。我是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(@”在%@上打开sqlite数据库,“databasePath”)行,“因此它看起来好像可以访问数据库。但是,当我运行应用程序时,我得到“NSLog(@”sql问题出现:%s“,sql);”错误,我可以在控制台中看到。此外,在控制台中,它显示“没有这样的表:tblStore”。

我使用Firefox附加SQLite Manager创建了表。我将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”有关,但我不确定是什么。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您的代码似乎没问题 - 您是否将数据库复制到项目的资源文件夹中?

修改

确保使用以下内容访问您的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));
        }

}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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