Вставка данных в базу данных sqlite на iPhone - не работает - PullRequest
0 голосов
/ 14 марта 2012

Я новичок в использовании sqlite и iPhone, и у меня возникли проблемы с добавлением записи в мою базу данных. Я использовал все, что могу в Интернете, чтобы попытаться решить эту проблему, но я застрял в колее.

Я использую этот фрагмент кода, чтобы попытаться добавить запись в базу данных в sqlite:

    -(void)insertData{

    sqlite3 *database;
    sqlite3_stmt *statement;
    NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"ProductDatabase" ofType:@"sql"];
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        //nutrional values
        float caloriesFloat = [caloriesTextField.text floatValue];
        float saturatesFloat = [saturatesTextField.text floatValue];
        float fatFloat = [fatTextField.text floatValue];
        float fibreFloat = [fibreTextField.text floatValue];
        float sugarFloat = [sugarTextField.text floatValue];
        float saltFloat = [saltTextField.text floatValue];

        NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO products (name,category,calories, saturates,fat,fibre,sugar,salt) VALUES ('%@',' %@','%.02f','%.02f','%.02f','%.02f','%.02f','%.02f',);",nameTextField.text, categoryLabel.text, caloriesFloat, saturatesFloat, fatFloat, fibreFloat, sugarFloat, saltFloat];
        const char *insert_stmt = [insertSQL UTF8String];
        if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK)
        {
            sqlite3_bind_text(statement, 1, [nameTextField.text UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [categoryLabel.text UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", caloriesFloat] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", saturatesFloat] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", fatFloat] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", fibreFloat] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", sugarFloat] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", saltFloat] UTF8String], -1, NULL);
        }

        if(sqlite3_step(statement)==SQLITE_DONE) 
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];    
            [alert show];

        }
        else 
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
            [alert show];
            alert=nil;
        }   
        // Release the compiled statement from memory
        sqlite3_finalize(statement);    
        sqlite3_close(database);
    }
}

Всегда отображается предупреждение «Товар не добавлен», может кто-нибудь объяснить, почему моя запись не добавляется?

Спасибо

Jack

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Это потому, что вы непосредственно записываете данные в database в папке ресурсов. Это не доступно для записи, сначала вам нужно скопировать database в document directory.

NSString *databasePath=[[NSBundle mainBundle]pathForResource:@"ProductDatabase" ofType:@"sql"];

Добавьте код, написанный ниже после строки выше

NSError *err=nil;
    NSFileManager *fm=[NSFileManager defaultManager];

    NSArray *arrPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, -1);
    NSString *path=[arrPaths objectAtIndex:0];
   NSString path2= [path stringByAppendingPathComponent:@"ProductDatabase.sql"];


   if(![fm fileExistsAtPath:path2])
    {

      bool success=[fm copyItemAtPath:databasePath toPath:path2 error:&err];
        if(success)
            NSLog(@"file copied successfully");
       else
           NSLog(@"file not copied");

    }

и удалите операторы связывания из кода и измените его на

if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK)
        {
           

        if(sqlite3_step(statement)==SQLITE_DONE) 
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];    
            [alert show];

        }
        else 
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
            [alert show];
            alert=nil;
        }   
}
1 голос
/ 14 марта 2012

Во-первых, скопируйте свою базу данных в документы. Вы не можете изменить его в основном комплекте.

Во-вторых, существует два способа создания и выполнения операторов sql в базе данных sqlite3.

Одним из способов является создание всей строки sql с использованием строковых операций (us% @,% d и т. Д. Для добавления строковых и числовых значений) и выполнение sql в БД.

Другой способ - задать вопросительный знак (?) Для каждой из ваших переменных в строке sql и связать переменную с каждой из них? использование операторов sqlite3_bind

У каждого подхода есть свои плюсы и минусы, но вы можете выбрать тот, который вам нужен. Вы оба не правы в своем коде, что неверно

Кроме того, вам не нужно преобразовывать каждое числовое значение в строку, если вы хотите связать его с оператором. Вы можете использовать sqlite3_bind_int, sqlite3_bind_double и т. д.

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