找不到更新的SQLite IOS行

时间:2014-02-12 10:15:11

标签: ios objective-c sqlite insert-update

我有一个应用程序,我会详细介绍用户并将其保存到SQLite数据库。此外,我能够找到详细信息并显示结果。

-(void) createDB{
NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(
                                               NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = dirPaths[0];

// Build the path to the database file
_databasePath = [[NSString alloc]
                 initWithString: [docsDir stringByAppendingPathComponent:
                                  @"contactUnique6.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: _databasePath ] == NO)
{
    const char *dbpath = [_databasePath UTF8String];

    if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt =
        "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT , NAME TEXT , ADDRESS TEXT, PHONE TEXT )";

        if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {
            _status.text = @"Failed to create table";
        }
        sqlite3_close(_contactDB);
    } else {
        _status.text = @"Failed to open/create database";
    }
}



- (IBAction)saveData:(id)sender {
sqlite3_stmt    *statement;
const char *dbpath = [_databasePath UTF8String];

if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
{

    NSString *insertSQL = [NSString stringWithFormat:
                           @"INSERT OR IGNORE INTO CONTACTS (name, address, phone) VALUES (\"%@\", \"%@\", \"%@\")",
                           _name.text, _address.text, _phone.text];
      const char *insert_stmt = [insertSQL UTF8String];

    sqlite3_prepare_v2(_contactDB, insert_stmt,
                       -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        _status.text = @"Contact added";
        _name.text = @"";
        _address.text = @"";
        _phone.text = @"";
    } else {
        _status.text = @"Failed to add contact";
    }
    sqlite3_finalize(statement);
    sqlite3_close(_contactDB);
}

}

- (IBAction)findContact:(id)sender {
const char *dbpath = [_databasePath UTF8String];

sqlite3_stmt    *statement;

if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat:
                          @"SELECT address, phone FROM contacts WHERE name=\"%@\"",
                          _name.text];

    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(_contactDB,
                           query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        if (sqlite3_step(statement) == SQLITE_ROW)
        {
            NSString *addressField = [[NSString alloc]
                                      initWithUTF8String:
                                      (const char *) sqlite3_column_text(
                                                                         statement, 0)];
            _address.text = addressField;
            NSString *phoneField = [[NSString alloc]
                                    initWithUTF8String:(const char *)
                                    sqlite3_column_text(statement, 1)];
            _phone.text = phoneField;
            _status.text = @"Match found";
        } else {
            _status.text = @"Match not found";
            _address.text = @"";
            _phone.text = @"";
        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(_contactDB);
}

}

上面的代码运行良好。但是,当我尝试使用更新时,当我尝试找到它时,它不会显示。即使联系人已保存,它也会找不到匹配项。

这是我尝试更新的代码:

- (IBAction)saveData:(id)sender {
sqlite3_stmt    *statement;
const char *dbpath = [_databasePath UTF8String];

if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
{

    NSString *insertSQL = [NSString stringWithFormat:
                           @"INSERT OR IGNORE INTO CONTACTS (name, address, phone) VALUES (\"%@\", \"%@\", \"%@\")",
                           _name.text, _address.text, _phone.text];

    insertSQL = [NSString stringWithFormat:
                 @"UPDATE CONTACTS SET name=\"%@\", address=\"%@\", phone=\"%@\"",
                 _name.text, _address.text, _phone.text];

     const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(_contactDB, insert_stmt,
                       -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        _status.text = @"Contact added";
        _name.text = @"";
        _address.text = @"";
        _phone.text = @"";
    } else {
        _status.text = @"Failed to add contact";
    }
    sqlite3_finalize(statement);
    sqlite3_close(_contactDB);
}

}

基本上我的目标是能够保存更新 - 查找。 (因为我有FK关系,所以在更新时不会丢失主键)

修改 这是我的create db方法      - (void)createDB {     NSString * docsDir;     NSArray * dirPaths;

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(
                                               NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = dirPaths[0];

// Build the path to the database file
_databasePath = [[NSString alloc]
                 initWithString: [docsDir stringByAppendingPathComponent:
                                  @"contactUnique6.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: _databasePath ] == NO)
{
    const char *dbpath = [_databasePath UTF8String];

    if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt =
        "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT , NAME TEXT , ADDRESS TEXT, PHONE TEXT )";

        if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {
            _status.text = @"Failed to create table";
        }
        sqlite3_close(_contactDB);
    } else {
        _status.text = @"Failed to open/create database";
    }
}

1 个答案:

答案 0 :(得分:0)

我无法得到你的第二个 - (IBAction)saveData:(id)sender {}方法[第三个代码块] ..

你说上面2块正常工作所以没问题。

我认为您在插入逻辑中嵌入了更新的逻辑,即您在saveData方法中嵌入了更新方法。

在这里,我无法得到你所做的,所以在这里代替代码,我提供更新查询的模板,只需将你的代码放入其中......

sqlite3_stmt *statement;
if(sqlite3_open(dbpath, &database_object) == SQLITE_OK)
{
    NSString *sql = [NSString stringWithFormat:@"update table_name set column_name = \"%@\"", Your_value];
    const char *sql_stmt = [sql UTF8String];
    if(sqlite3_prepare_v2(database_object , sql_stmt, -1, &statement, NULL) != SQLITE_OK)
         NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database_object));
    if(SQLITE_DONE != sqlite3_step(statement))
         NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database_object));
    sqlite3_finalize(statement);
}

使用此模板,我认为它适合您...