【问题标题】:Problems with SQLite3 Insert statement, xcode 4.2 developing for IOS 5SQLite3 Insert 语句的问题,xcode 4.2 为 IOS 5 开发
【发布时间】:2015-11-05 05:12:26
【问题描述】:

这是我第一次尝试为 IOS 或任何 IOS 应用程序开发 SQLite 数据库。我正在尝试按照我在网上找到的教程进行调整以供我自己使用。数据库的创建没有任何问题,但我的 Insert 语句似乎永远不会返回我的错误消息。 控制台中没有出现任何内容,因为程序实际上没有出现任何严重问题。如果您需要更多信息,我会尽力找到并更新问题。

这是我的代码:

// Method to store a GPS location
-(void)insertGPS:(GPS*)GPS
{
// Create insert statement for the person
NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO GPSJob (jobNo, sourceMonitor, positionNumber, latitude, longitude) VALUES (\"%@\", \"%@\", \"%@\",\"%@\",\"%@\")", GPS.jobNumber, GPS.sourceMonitor, GPS.positionNumber, GPS.latitude, GPS.longitude ];
// Define an error
char *error;
// Attempt to execute the insert statement
if ( sqlite3_exec(databaseHandle, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)
{
    NSLog(@"GPS inserted into database with values: %@, %@, %@, %@, %@.", GPS.jobNumber, GPS.sourceMonitor, GPS.positionNumber, GPS.latitude, GPS.longitude);
}
// If the insert statement is not okay
else {
    NSLog(@"Error: %s", sqlite3_errmsg(databaseHandle));
}
}

这是我正在关注的教程:http://www.apptite.be/tutorial_ios_sqlite.php

更新的错误信息是这样说的:

2015-08-12 15:28:25.299 NoiseApp[7602:207] Error: out of memory

-----------------------解决办法---------- ----------------------

对于任何想要解决这个问题的人,我只是将函数修改为如下:

// Method to store a GPS location
-(void)insertGPS:(GPS*)GPS
   {    
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"GPS.db"];
if(sqlite3_open([databasePath UTF8String], &databaseHandle) ==SQLITE_OK){
// Create insert statement for the person
NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO GPSJob (jobNo, sourceMonitor, positionNumber, latitude, longitude) VALUES (\"%@\", \"%@\", \"%@\",\"%@\",\"%@\")", GPS.jobNumber, GPS.sourceMonitor, GPS.positionNumber, GPS.latitude, GPS.longitude ];
// Define an error
char *error;
// Attempt to execute the insert statement
if ( sqlite3_exec(databaseHandle, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)
{
    NSLog(@"GPS inserted into database with values: %@, %@, %@, %@, %@.", GPS.jobNumber, GPS.sourceMonitor, GPS.positionNumber, GPS.latitude, GPS.longitude);
}
// If the insert statement is not okay
else  {
    NSLog(@"Error: %s", sqlite3_errmsg(databaseHandle));
}
}
}

【问题讨论】:

  • 不要输出固定的(无用的)错误信息。让数据库告诉你出了什么问题。 NSLog(@"Error: %s", sqlite3_errmsg(databaseHandle));
  • 是的,请在语句执行后至少发布error的值;另外,实际返回的状态很重要,所以也要打印出来
  • 你为什么要在'if'中执行该语句两次?执行一次并将结果存储在变量中;你的 else if 一般没有意义,因为如果它不是 0 那么它就不是......如果你在这里关注我。或者,您是否尝试执行该语句两次,以防它第二次起作用?
  • 我没有意识到我告诉它执行该语句两次,老实说,这只是粗心的尝试使其工作的尝试。它只是为了在它不起作用时打印错误消息。

标签: ios cocoa-touch ios5 sqlite xcode4.2


【解决方案1】:

databaseHandle 未在您的函数中定义。您应该在某处获得对 sqlite3_open 的引用。

如果您还没有这样做,请使用 sqlite3_open 打开您的数据库。 打开的例子。 (注意如果你想写这个数据库,你应该把它从resourcePath复制到可写的地方,然后打开这个版本)

databaseName = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DB.sql"];
if(sqlite3_open([databaseName UTF8String],&databaseHandle) == SQLITE_OK)
{
}

【讨论】:

  • 解决了这个问题,我没有意识到数据库已经关闭 - 是否有禁用自动引用计数?
猜你喜欢
  • 2013-08-24
  • 2012-11-28
  • 2012-10-30
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多