Запись в базу данных SQLite.Что-то странное - PullRequest
2 голосов
/ 01 апреля 2012

Я использую базу данных SQLite. Проблема в том, что данные не записываются в базу. NSLog показывает мне "Все в порядке" и insertSQL также правильно, но записи в базе данных по-прежнему не происходит. Мой код:

-(void)saveMessage:(id)sender 
{
    sqlite3 *database;

    databaseName = @"BlogDatabase.sqlite";
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
        {

            NSString *insertSQL = [NSString stringWithFormat:@"insert into \"main\".\"MessagesData\" ( \"MessageText\", \"MessageDate\") values ( '%@', '%@');", _textField.text, [[NSDate alloc] init]];
            NSLog(@"%@", insertSQL);
            const char *insert_stmt = [insertSQL UTF8String];
            sqlite3_stmt *compiledStatement;


            if(sqlite3_prepare_v2(database, insert_stmt, -1, &compiledStatement, NULL) != SQLITE_OK)
                {
                    NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
                    }else{
                    if (sqlite3_step(compiledStatement) == SQLITE_DONE)
                        {
                            NSLog(@"All ok");
                            } else {
                            NSLog(@"FAIL");
                            }
                        }
            sqlite3_finalize(compiledStatement);
            }
    sqlite3_close(database);
    }

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Вы должны изменить свой код, как показано ниже.

-(void)saveMessage:(id)sender 
{
sqlite3 *database;

databaseName = @"BlogDatabase.sqlite";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];


  NSFileManager *fileManager = [NSFileManager defaultManager];

  BOOL success = [fileManager fileExistsAtPath:file];

  if(!success) {
      databasePath = [[NSBundle mainBundle] pathForResource:databaseName ofType:nil];
  }

Также поставьте NSLog (@ "Ошибка. '% S'", sqlite3_errmsg (база данных)); после каждой операции над базой данных. (т.е. после sqlite3_step, sqlite3_prepare и т. д.). Это напечатает точное сообщение об ошибке при использовании базы данных.

1 голос
/ 01 апреля 2012

В какой базе данных вы ищете?app db?

Можете ли вы проверить количество записей, просто посчитайте записи.

SELECT count (*) FROM your_table_name

Я сомневаюсь, есть ли у вас какое-либо значение в вашем _textField.text и дата, которую вы только что инициализировалине устанавливая это.и давайте предположим, что все в порядке, тогда

вы должны использовать BlogDatabase.MessagesData , а не main.MessagesData.

сначала попытайтесь запустить тот insertQuery, который вы NSLog, в своем обычном терминале, sqlite3 [app_db_path] /BlogDatabase.sqlite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...