向SQLite数据库-iOS插入行时出错(我认为这与数据类型有关)

向SQLite数据库-iOS插入行时出错(我认为这与数据类型有关),ios,objective-c,database,sqlite,sqldatatypes,Ios,Objective C,Database,Sqlite,Sqldatatypes,在我的代码中,我试图在我创建的SQLite数据库中的表中插入一个新行。 现在,当我创建open数据库时,我检查它是否正确打开,但当我尝试将一行插入其中一个表时,它不起作用。部分代码检查文档文件夹中是否已经存在DB文件,如果不存在,则创建一个DB文件。现在我认为数据类型可能有问题。。。这会产生错误吗?代码如下,请注意,插入到表中的值是如下定义的对象的属性: @property (nonatomic) int connectionRefNumber; @property (nonatomic) in

在我的代码中,我试图在我创建的SQLite数据库中的表中插入一个新行。 现在,当我创建open数据库时,我检查它是否正确打开,但当我尝试将一行插入其中一个表时,它不起作用。部分代码检查文档文件夹中是否已经存在DB文件,如果不存在,则创建一个DB文件。现在我认为数据类型可能有问题。。。这会产生错误吗?代码如下,请注意,插入到表中的值是如下定义的对象的属性:

@property (nonatomic) int connectionRefNumber;
@property (nonatomic) int otherUserID;
@property (strong, nonatomic) NSString * otherUserName;
@property (strong, nonatomic) NSString * otherUserProfilePicturePath;
@property (strong, nonatomic) NSDate * connectionDate;
@property (nonatomic) BOOL * otherUserFB;
@property (nonatomic) BOOL * otherUserTW;
@property (nonatomic) BOOL * otherUserHP;
打开数据库并填充表的数据库方法(如果数据库本身不存在,则在另一个方法中创建)。这是我为处理所有数据库相关任务而创建的特殊类的一部分:

-(void)initDatabase {
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
/*NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * databasePath = [documentsDirectory stringByAppendingPathComponent:@"sqlite.db"];*/
NSArray * pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * databasePath = [[pathArray objectAtIndex:0] stringByAppendingPathComponent:@"sqlite.db"];

BOOL databaseAlreadyExists = /*[[NSFileManager defaultManager] fileExistsAtPath:databasePath];*/NO;


if (sqlite3_open([databasePath UTF8String],&databaseHandle) == SQLITE_OK){
    NSLog(@"DATABASE OPEN");
    if (!databaseAlreadyExists){
        const char * sqlStatement = "CREATE TABLE IF NOT EXISTS CONNECTIONS (CONNECTIONREFNUMBER INTEGER PRIMARY KEY  AUTOINCREMENT , OTHERUSERID INTEGER, OTHERUSERNAME VARCHAR, OTHERUSERPICTUREPATH VARCHAR, CONNECTIONDATE DATETIME, OTHERUSERFB BOOL, OTHERUSERTW BOOL, OTHERUSERHP BOOL)";
        char *error;
        if (sqlite3_exec(databaseHandle, sqlStatement, NULL, NULL, &error) == SQLITE_OK) {
            NSLog(@"DATABSE AND TABLES CREATED");
        } else {
            NSLog(@"ErrorL %s", error);
        }
    }
}else{
    NSLog(@"cant open database");
}
}

最后,我用来调用此方法的代码,这里可能是我在数据类型方面的错误之处:

ConectionsDataController * dataController = [[ConectionsDataController alloc] init];
//[dataController initDatabase];
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
int ID = 1;
int RefNumber = 1;
BOOL fb = YES;
BOOL tw = YES;
BOOL hp = YES;
NSDate *connectionDate = [dateFormatter dateFromString:@"1955-02-24"];
connectionData * connectionObject = [[connectionData alloc]initWithConnectionRefNumber:&RefNumber    otherUserID:&ID otherUserName:@"John Jones" otherUserProfilePicturePath:@"/1" connectionDate:connectionDate otherUserFB:&fb otherUserTW:&tw otherUserHP:&hp];
[dataController insertConnectionToDatabase:connectionObject];

刚让别人看了我的代码,他就揭发了问题,所以我决定在这里分享:

在数据库中,我将其中一列定义为主键。这意味着它对于每一行都必须是唯一的。现在出于测试目的,我只使用了一个,所以它工作了一次,但当我再次尝试它时(仍然使用1),它不是唯一的,因此不能将其作为主键列的值

只是在开发和调试时要注意的东西,因为它可能会被忽略,尤其是在没有太多使用数据库的经验的情况下