Sqlite, похоже, не нравится мое заявление об удалении - PullRequest
0 голосов
/ 21 июля 2010

У меня следующий код iphone, который, похоже, не работает:

sqlite3_stmt *dbps;
NSString *sql = @"delete from days where day=?1;insert into days(disabled,recipe_id,day) values(?2,?3,?1)";
int rc = sqlite3_prepare_v2(db, sql.UTF8String, -1, &dbps, NULL);
...

Код возврата 'rc' равен 1, что означает SQLITE_ERROR (ошибка SQL или отсутствие базы данных, согласно сайту sqlite). Не уверен, что я сделал не так? База данных 'db' действительно открыта, и другие запросы работают нормально.

Большое спасибо, ребята

Ответы [ 3 ]

2 голосов
/ 21 июля 2010

Удалите оператор вставки из вашей строки.В любом случае он не компилируется, поскольку sqlite3_prepare_v2 будет «компилировать только первый оператор в zSql

Возможно, вам следует использовать триггер для (необязательного) удаления или использовать insert or replace.

1 голос
/ 22 июля 2010

Глупый я, у меня просто была старая копия схемы в папке «Документы», в которой не было таблицы «дней». Поэтому я следовал инструкциям здесь: Очистка симулятора iPhone , затем он скопировал новую схему и снова начал работать.

Спасибо за помощь, ребята.

1 голос
/ 21 июля 2010

Вы уверены, что скопировали базу данных в папку «Документы» перед ее открытием?iPhone OS позволяет только разрешения на запись в каталоге документов.Вот код для копирования базы данных в каталог документов -

//function to copy database in Documents dir.

    -(void) checkAndCreateDatabase{
        // Check if the SQL database has already been saved to the users phone, if not then copy it over
        BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:databasePath];

    // If the database already exists then return without doing anything
    if(success) return;

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    [fileManager release];


  }


// open the database and fire the delete query...


    sqlite3 *database;
    NSString *sqlStatement = @"";



    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
            NSLog(@"%@",databasePath);
    [serlf checkAndCreateDatabase];



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

// here you can fire the delete query...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...