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

时间:2012-08-05 08:05:42

标签: ios objective-c database sqlite sqldatatypes

在我的代码中,我试图在我创建的SQLite数据库中的表中插入一个新行。 现在,当我创建打开数据库时,我检查它是否正确打开它是,但是当我尝试在其中一个表中插入一行时,它不起作用。部分代码检查文件夹中是否已存在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 个答案:

答案 0 :(得分:0)

让其他人看看我的代码并揭开问题,所以我决定在这里分享:

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

开发和调试时需要注意的事项,因为它可能会被忽略,尤其是在使用数据库方面经验不足的情况下。