1

iOSプロジェクトのデータベースとしてsqlite3を使用しており、if presentステートメントを実行して、オブジェクトが存在するかどうかを確認し、存在する場合は更新または挿入します。

この関数を使用してデータベースをクエリしています

-(void)updateStatus:(NSString *)queryString {
    NSString    *docsDir;
    NSArray     *dirPaths;
    dirPaths    = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir     = [dirPaths objectAtIndex:0];
    m_singleton = [Singleton sharedSingleton];

    strDatabasePath         = [NSString stringWithString:[docsDir stringByAppendingPathComponent:@"BorneoMotors.db"]];
    NSFileManager *filemgr  = [NSFileManager defaultManager];

    if ([filemgr fileExistsAtPath: strDatabasePath] == YES)
    {
        const char *dbpath = [strDatabasePath UTF8String];
        if (sqlite3_open(dbpath, &sqlDatabase) == SQLITE_OK)
        {
            const char* beginString = "BEGIN;";
            sqlite3_stmt *compiledstatement;
            sqlite3_prepare_v2(sqlDatabase, beginString, -1, &compiledstatement, NULL);
            if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
            else NSLog(@"Failed!");
            sqlite3_finalize(compiledstatement);



            NSLog(@"QUERY : %@",queryString);

            const char *selectStatement = [queryString UTF8String];

            sqlite3_prepare_v2(sqlDatabase, selectStatement, -1, &compiledstatement, NULL);
            //sqlite3_bind_text(compiledstatement,1,[statusString UTF8String],-1,SQLITE_TRANSIENT);

            if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
            else NSLog(@"Failed!");
            sqlite3_finalize(compiledstatement);


            const char* endString="END;";
            sqlite3_prepare_v2(sqlDatabase, endString, -1, &compiledstatement, NULL);
            if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
            else NSLog(@"Failed!");
            sqlite3_finalize(compiledstatement);

            sqlite3_close(sqlDatabase);
        }
        else NSLog(@"Failed to open table");
    }

}

私が抱えている問題は、これが存在する場合は何が返されるのか、そしてどのようにそれを進めるのかということです。

NSString *checkstring = [NSString stringWithFormat:@"IF EXISTS (SELECT * FROM DATABASE WHERE id = %@",cars.ID];
                    DB *accessdb = [[DB alloc] init];
                    [accessdb updateStatus:checkstring];
                    if (??){
                        NSString *queryString = [NSString stringWithFormat: @"UPDATE DATABASE SET STATUS='%@' WHERE \"DATABASEID\" = '%@'", cars.status,cars.ID];
                        const char *selectStatement = [queryString UTF8String];

                        sqlite3_prepare_v2(sqlDatabase, selectStatement, -1, &statement, NULL);
                        //sqlite3_bind_text(compiledstatement,1,[statusString UTF8String],-1,SQLITE_TRANSIENT);

                        if (sqlite3_step(statement) == SQLITE_DONE) {}
                        else NSLog(@"Failed!");
                        sqlite3_finalize(statement);
                    }else{
                        insert}

オブジェクトの存在を確認するにはどうすればよいですか?if presentsは何を返しますか?ガイダンスが必要です...

4

1 に答える 1

1

IFSQLiteにはステートメントがありません。

レコードが存在するかどうかを確認するには、次のようなクエリを実行します。

SELECT 1 FROM database WHERE ID = ?

記録を取り戻すかどうかをアプリでテストします。

更新/挿入の問題の場合:キー列に一意のインデックスがある場合、新しいレコードが重複を作成する場合は、古いレコードを自動的に削除するINSERT OR REPLACEコマンドを使用できます。

于 2012-11-19T17:53:57.777 に答える