0

私のコードでは、作成した SQLite データベースのテーブルに新しい行を挿入しようとしています。データベースを開いて作成するときに、正しく開いているかどうかを確認しますが、テーブルの1つに行を挿入しようとすると機能しません。コードの一部は、ドキュメント フォルダーに 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];
4

1 に答える 1

0

他の誰かに私のコードを見てもらい、彼が問題を明らかにしたので、ここで共有することにしました。

データベースには、PRIMARY KEY として定義された列の 1 つがあります。これは、すべての行で一意でなければならないことを意味します。テスト目的で、1つだけ使用したので、1回は機能しましたが、もう一度試してみると(まだ1で)、一意ではなかったため、主キー列の値として配置できませんでした。

特にデータベースの操作経験があまりない場合、見落とされる可能性があるため、開発およびデバッグ時に確認する必要があります。

于 2012-08-05T08:25:52.630 に答える