цель c - iPhone - замена локальной копии базы данных sqlite - PullRequest
0 голосов
/ 19 марта 2012

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

Я хотел бы знать, чтоМожно ли как-нибудь заменить локальную копию базы данных, хранящейся на iPhone, версией, которую пользователь, по сути, создает, с добавлением новых записей?Если я на самом деле не могу заменить базу данных, что было бы наилучшим способом действий, чтобы новые записи сохранялись?

Спасибо,

Джек

РЕДАКТИРОВАТЬ: База данных хранится в каталоге документов.

РЕДАКТИРОВАТЬ 2:

В основном, если приведенный ниже код выполняется, как бы я зафиксировал изменения, внесенные оператором вставки, чтобы приложенияверсия базы данных обновляется, а не только временная копия?

-(void)insertData{

    sqlite3 *database;
    sqlite3_stmt *statement;

    //Get the path to the documents directory and append the databaseName
    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
    NSString *databasePath = [appDelegate m_DatabasePath];
    NSLog(@"%@", [appDelegate m_DatabasePath]);
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {

        NSString *insertSQL = @"INSERT INTO products (name,category,calories, saturates,fat,fibre,sugar,salt, image) VALUES ('Snickers',' Confectionary','300','55','55','55','55','55', 'http://upload.wikimedia.org/wikipedia/en/8/88/Snickers_wrapped.jpg');";
        const char *insert_stmt = [insertSQL UTF8String];
        if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL)== SQLITE_OK)
        {
            NSLog(@"Here 1");
            if(sqlite3_step(statement)==SQLITE_DONE) 
            {
                //Create a new animal object with the data from the database
                Product *l_Product = [[Product alloc] initWithName:@"Snickers" category:@"Confectionary" calories:@"300" fat:@"55" saturates:@"50" sugar:@"10" fibre:@"50" salt:@"5" imageURL:@"http://upload.wikimedia.org/wikipedia/en/8/88/Snickers_wrapped.jpg" ];

                //Add the animal object to the animals array
                [appDelegate.m_Products addObject:l_Product];

                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);
    }
}

Ответы [ 3 ]

0 голосов
/ 19 марта 2012

Если БД SQLite заменяется при перезапуске, то, вероятно, вы что-то делаете неправильно в коде.

Вместо того, чтобы отправлять БД SQLite в ресурсы для приложения, динамически создавайте базу данных.Каждый раз, когда приложение запускается, запускайте некоторый код инициализации для создания БД.Операторы должны выглядеть следующим образом: -

create TABLE if not exists...

Если вы сделаете это и правильно подключитесь к базе данных, то обнаружите, что она работает как постоянное хранилище.

Don 'не забудьте, что вам сначала нужно будет создать базу данных (опять же, «если она не существует») и любые индексы.

0 голосов
/ 19 марта 2012

Вы можете предоставить свою базу данных в комплекте приложений, просто обязательно скопируйте «пустую» базу данных в каталог документов перед внесением изменений (возможно, в методе делегата appDidFinishLaunching после запуска).Это также позволит пользователю обновлять приложение в будущем, сохраняя при этом свои данные в целости.

0 голосов
/ 19 марта 2012

Приложение должно зафиксировать изменения , сделанные пользователем.

что-то вроде этого (взято из аналогичной темы )

char* errmsg;
int result = sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg);

см. Документы http://www.sqlite.org/search?q=commit

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