Есть ли лучший способ обновить таблицу sqlite?

0

Я использую следующий код для обновления данных в моей таблице sqlite, но всегда думал, что это не оптимальный способ сделать это. В принципе, поскольку я не знаю, что и где данные в моем двумерном NSMutableArray были обновлены пользователем, что я делаю, это удаление таблицы, создающей ее снова со всеми столбцами, а затем вставляя в нее данные.

Есть ли лучший способ сделать это путем сопоставления данных между таблицей и моим массивом. Обратите внимание на любую другую халатность, которая придет вам в глаза:

-(void)updateCurrentItemsData:(NSArray *) dataArray
{
NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory=[paths objectAtIndex:0];
gameDBPath=[documentsDirectory stringByAppendingPathComponent:@"gameData.sqlite"];
const char *dbpath = [gameDBPath UTF8String];
int test;
char *errMsg;
if (sqlite3_open(dbpath, &gamedatabase)==SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat:@"DELETE FROM currentitems"];
    const char *query_stmt = [querySQL UTF8String];
    test=sqlite3_exec(gamedatabase, query_stmt, NULL, NULL, &errMsg);
    if (test!=0) NSLog(@"exec is 5 1 %i",test);

    const char *sql_stmt = "CREATE TABLE IF NOT EXISTS currentitems(itemid, name, quantity, damaged, price)";
    test=sqlite3_exec(gamedatabase, sql_stmt, NULL, NULL, &errMsg);
    if (test!=0) NSLog(@"exec is 5 2 %i",test);
for (int i=0; i<dataArray.count; i++)
{
    NSString *querySQL= [NSString stringWithFormat:@"INSERT INTO currentitems(itemid, name, quantity, damaged, price) VALUES('%i','%@','%i','%i','%i')",[[[dataArray objectAtIndex:i] objectAtIndex:0] intValue],[[dataArray objectAtIndex:i] objectAtIndex:1],[[[dataArray objectAtIndex:i] objectAtIndex:2] intValue],[[[dataArray objectAtIndex:i] objectAtIndex:3] intValue],[[[dataArray objectAtIndex:i] objectAtIndex:4] intValue]];
    //NSLog(@"querySQL is %@",querySQL);

    const char *insert_stmt= [querySQL UTF8String];
    test=sqlite3_exec(gamedatabase, insert_stmt, NULL, NULL, &errMsg);
    if (test!=0) NSLog(@"exec is 5 3 %i",test);
}
    sqlite3_finalize(statementgame);
    sqlite3_close(gamedatabase);
}

}

Спасибо, что посмотрели :)

1 ответ

0

Вы можете увеличить производительность с помощью транзакций - просто посмотрите на слегка измененный код ниже:

-(void)updateCurrentItemsData:(NSArray *) dataArray
{
NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory=[paths objectAtIndex:0];
gameDBPath=[documentsDirectory stringByAppendingPathComponent:@"gameData.sqlite"];
const char *dbpath = [gameDBPath UTF8String];
int test;
char *errMsg;
if (sqlite3_open(dbpath, &gamedatabase)==SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat:@"DELETE FROM currentitems"];
    const char *query_stmt = [querySQL UTF8String];
    test=sqlite3_exec(gamedatabase, query_stmt, NULL, NULL, &errMsg);
    if (test!=0) NSLog(@"exec is 5 1 %i",test);

    const char *sql_stmt = "CREATE TABLE IF NOT EXISTS currentitems(itemid, name, quantity, damaged, price)";
    test=sqlite3_exec(gamedatabase, sql_stmt, NULL, NULL, &errMsg);
    if (test!=0) NSLog(@"exec is 5 2 %i",test);

sqlite3_exec(gamedatabase, "BEGIN TRANSACTION", NULL, NULL, NULL);

for (int i=0; i<dataArray.count; i++)
{
    NSString *querySQL= [NSString stringWithFormat:@"INSERT INTO currentitems(itemid, name, quantity, damaged, price) VALUES('%i','%@','%i','%i','%i')",[[[dataArray objectAtIndex:i] objectAtIndex:0] intValue],[[dataArray objectAtIndex:i] objectAtIndex:1],[[[dataArray objectAtIndex:i] objectAtIndex:2] intValue],[[[dataArray objectAtIndex:i] objectAtIndex:3] intValue],[[[dataArray objectAtIndex:i] objectAtIndex:4] intValue]];
    //NSLog(@"querySQL is %@",querySQL);

    const char *insert_stmt= [querySQL UTF8String];
    test=sqlite3_exec(gamedatabase, insert_stmt, NULL, NULL, &errMsg);
    if (test!=0) NSLog(@"exec is 5 3 %i",test);
}

sqlite3_exec(gamedatabase, "COMMIT TRANSACTION", NULL, NULL, NULL);

    sqlite3_finalize(statementgame);
    sqlite3_close(gamedatabase);
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню