在SQLite表中插入会导致崩溃

时间:2013-10-09 10:51:42

标签: iphone ios sqlite

当我在SQLite数据库中插入数据时,我的应用程序崩溃了。

我在SQLite数据库中插入数据的代码是

for (int i=0; i<[arrNewFriendsId count]; i++) {

NSString *stQuery=[NSString stringWithFormat:@"INSERT INTO NewFriendsTable (friend_id,friend_fullname) VALUES ('%@','%@')",[arrNewFriendsId objectAtIndex:i],[arrNewFriendsFullName objectAtIndex:i]];
    NSLog(@"Query registered NewFriendsTable : %@",stQuery);
    if (sqlite3_open([appdelegate.databasePath UTF8String], &database) == SQLITE_OK) {

        const char *sql =[stQuery cStringUsingEncoding:NSASCIIStringEncoding];

                    sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL);

        if(sqlite3_step(selectstmt)==SQLITE_DONE)
        {
            sqlite3_bind_text(selectstmt, 1, [[arrNewFriendsId objectAtIndex:i] UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(selectstmt, 3, [[arrNewFriendsFullName objectAtIndex:i] UTF8String], -1, SQLITE_TRANSIENT);
            NSLog(@"insert successfully NewFriendsTable ");
        }
        else
        {
            NSLog(@"insert not successfully NewFriendsTable ");

        }
        sqlite3_finalize(selectstmt);
    }

    sqlite3_close(database);


}}  

在上面的代码中,应用程序在此行崩溃了

sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL);

插入的数据来自FaceBook,插入查询是

INSERT INTO NewFriendsTable (friend_id,friend_fullname) VALUES ('100000564063540','Rãhüł Pâtęł') 

我没有遇到问题 我认为这与Rãhüł Pâtęł有关。因为它不是常规角色。

但后来也不知道这是确切的问题 任何建议,教程,代码,链接都会有很大的帮助。

4 个答案:

答案 0 :(得分:1)

  1. 请勿使用NSASCIIStringEncoding,尤其是非ASCII字符。 与SQLite 一起使用的所有字符串必须为UTF-8。
  2. 要使用参数,您实际上必须在查询中包含参数标记:

    "INSERT INTO NewFriendsTable (friend_id,friend_fullname) VALUES (?,?)"
    

    (这会自动消除格式问题。)

  3. 必须检查sqlite3_prepare_v2
  4. 的返回值
  5. 两个参数编号为12,而不是13
  6. 在致电sqlite3_bind_text之前,您必须致电sqlite3_step

答案 1 :(得分:1)

问题在您的代码中。

您正在使用的原因:

sqlite3_bind_text(selectstmt, 1, [[arrNewFriendsId objectAtIndex:i] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(selectstmt, 3, [[arrNewFriendsFullName objectAtIndex:i] UTF8String], -1, SQLITE_TRANSIENT);

因为您已在查询中拥有值。

您需要删除这些陈述。

使用类似:

for (int i=0; i<[arrNewFriendsId count]; i++)
{
    NSString *stQuery=[NSString stringWithFormat:@"INSERT INTO NewFriendsTable (friend_id,friend_fullname) VALUES ('%@','%@')",[arrNewFriendsId objectAtIndex:i],[arrNewFriendsFullName objectAtIndex:i]];
    NSLog(@"Query registered NewFriendsTable : %@",stQuery);
    if (sqlite3_open([appdelegate.databasePath UTF8String], &database) == SQLITE_OK)
    {
        const char *sql =[stQuery UTF8String];
        if(sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL) == SQLITE_OK)
        {
           if(sqlite3_step(selectstmt)==SQLITE_DONE)
           {
               NSLog(@"insert successfully NewFriendsTable ");
           }
           else
           {
              NSLog(@"insert not successfully NewFriendsTable ");
           }
           sqlite3_finalize(selectstmt);
        }
        sqlite3_close(database);
    }
} 

答案 2 :(得分:1)

cStringUsingEncoding:NSASCIIStringEncoding替换为UTF8String

const char *sql =[stQuery UTF8String];  

数据库

上的好Tutorial

答案 3 :(得分:0)

您正在{@ 1}}获取下面一行的Facebook ID,而且是%@。我希望,您在数据库中的facebook id字段类型不是String

integer

如果您的脸谱ID字段不是 NSString *stQuery=[NSString stringWithFormat:@"INSERT INTO NewFriendsTable (friend_id,friend_fullname) VALUES ('%@','%@')",[arrNewFriendsId objectAtIndex:i],[arrNewFriendsFullName objectAtIndex:i]]; ,则可以尝试以下。

integer