我正在开发一个应用程序,它从文本字段中获取输入并将其放入字符串中。我有一个表中包含一个字段的表,我想根据输入中的字符串值检查数据库中字段的值。我是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”有关,但我不确定是什么。有什么建议吗?
答案 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 /),然后单击确定。 你将获得纪录片路径。 打开项目文档文件并粘贴数据库....