【问题标题】:Integer not stored in database (sqlite3)整数未存储在数据库中(sqlite3)
【发布时间】:2012-06-07 11:58:28
【问题描述】:

根据我对上一篇文章中收到的不同答案的理解,我更改了代码。代码如下:

float lastClicked = 0.0;

- (void)viewDidLoad
{
[super viewDidLoad];

NSString *contentDirectory;
NSArray *directoryPath;
const char *dbpath = [databasePath UTF8String];

directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
contentDirectory = [directoryPath objectAtIndex:0];

databasePath = [[NSString alloc] initWithString: [contentDirectory stringByAppendingPathComponent: @"MCFRatingDatabase.db"]];

NSFileManager *filemanager = [NSFileManager defaultManager];
if ([filemanager fileExistsAtPath:databasePath] == NO){


    if (sqlite3_open(dbpath, &connectDB) == SQLITE_OK)
    {
        char *errorMessage;
        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS IMAGERATING (CONTENTNAME STRING, RATING FLOAT)";
        if (sqlite3_exec(connectDB, sql_stmt, NULL, NULL, &errorMessage) != SQLITE_OK)
        {
            NSLog(@"FAILED TO CREAT TABLE");
        }
        sqlite3_close(connectDB);

    } else {
        NSLog(@"FAILED TO OPEN/CREATE DATABASE");
    }
}
[filemanager release];

sqlite3_stmt *statement;

if (sqlite3_open(dbpath, &connectDB) == SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM IMAGERATING WHERE CONTENTNAME = '%@'", titleString];
    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(connectDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        if (sqlite3_step(statement) == SQLITE_ROW)
        {
            display = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
            rate = sqlite3_column_double(statement, 2);
            NSLog(@"contents are name = %@ and rating = %f", display, rate);                
        }else{

        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(connectDB);
}    
}


-(IBAction)rateSubmitClick:(id)sender{

sqlite3_stmt *statement;
NSString *insertSQL;

const char *dbpath = [databasePath UTF8String];

if (sqlite3_open(dbpath, &connectDB) == SQLITE_OK){

    if(isHalfClicked){
        rating = lastClicked + 0.5;
        insertSQL = [NSString stringWithFormat: @"INSERT INTO IMAGERATING (CONTENTNAME, RATING) VALUES (\"%@\", %f)", titleString, rating];
    }else{

        rating = lastClicked;
        insertSQL = [NSString stringWithFormat: @"INSERT INTO IMAGERATING (CONTENTNAME, RATING) VALUES (\"%@\", %f)", titleString, rating];
    }

    const char *insert_stmt = [insertSQL UTF8String];

    sqlite3_prepare_v2(connectDB, insert_stmt, -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE){

        NSLog(@"Added records are = %@  %f", titleString, rating);
        isRated=YES;
    }else{
        NSLog(@"FAILED TO ADD RECORD");
    }
    sqlite3_finalize(statement);
    sqlite3_close(connectDB);
}   
}

但现在的问题是没有插入任何内容。日志显示“未能添加记录”。

我真的搞砸了这个数据库的东西,需要你的帮助。

【问题讨论】:

  • 也许你应该通过只发布相关代码来缩短问题。

标签: objective-c ios sqlite


【解决方案1】:

您正在用引号将您的整数/浮点值包装在插入语句中。不要那样做。

您的 SQL 词干应如下所示:

INSERT INTO USERRATING (CONTENTNAME, RATING) VALUES ("mycontentname", 4.5);

举个例子。

或者换一种说法,你的代码应该是:

 if(isHalfClicked)
    {
        rating=lastClicked+0.5;
        insertSQL = [NSString stringWithFormat: @"INSERT INTO USERRATING (CONTENTNAME, RATING) VALUES (\"%@\", %f)",titleString,rating];
    }
    else {

        insertSQL = [NSString stringWithFormat: @"INSERT INTO USERRATING (CONTENTNAME, RATING) VALUES (\"%@\", %d)",titleString,lastClicked ];
          }

【讨论】:

  • 我照你说的做了,但还是有同样的问题
  • 抱歉,我错过了您尝试将浮点数存储在 int 字段中的事实。不要那样做。将评级更改为 REAL 类型。此外,最好在创建表时对每列设置 NOT NULL 约束。
【解决方案2】:

在您的插入语句中,您将lastClicked 链接到评级。您应该将评级链接到它。看起来像一个错字。

此外,您在创建表时创建了一个整数类型的字段,如果您还存储其他值,它应该是浮点数。


编辑:

从您的日志语句中可以清楚地看出,您第二次没有将记录添加到数据库中。字符串RECORD ADDED 没有被记录 - 日志行必须来自其他地方。

【讨论】:

  • lastClicked 用于存储整数评级(1、2、3、4 或 5),而评级存储浮点值(1.5、2.5 等)
  • 我仍然认为这是您的插入语句。尝试删除引号。另外,请参阅我的编辑
  • 虽然字段类型是整数,但即使是整数值也不存储
  • 查看我的编辑。我认为您的程序流程逻辑有问题,没有将记录插入数据库。
猜你喜欢
  • 2011-10-05
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多