Проблема персистенции Xcode Sqlite - PullRequest
1 голос
/ 27 августа 2010

У меня проблема с сохранением в моем приложении.Я использую базу данных sqlite.когда некоторые запросы вставки выполняются, результаты временно добавляются в базу данных.После перезапуска приложения новые значения исчезают!Я думаю, что новые значения, хранящиеся в оперативной памяти, не сохраняются на жестком диске.

    -(IBAction)add:(id)sender
{

NSString *myDB;
NSString *query;
myDB=[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Ssozluk.sql"];
database =[[Sqlite alloc] init];
[database open:myDB];
query=[NSString stringWithFormat:@"INSERT INTO words(col_1,col_2) VALUES('asd','asd2');"];

[database executeNonQuery:query];
[database commit];
[database close];

}

 -(IBAction)show:(id)sender
    {
    NSString *myDB;
    NSString *query;
    NSArray *asdasd;
    NSString *asd;
    myDB=[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Ssozluk.sql"];
    database =[[Sqlite alloc] init];
    [database open:myDB];
    query=[NSString stringWithFormat:@"Select col_2,col_1 FROM words"];

     asdasd=[database executeQuery:query];
     for(NSDictionary *row in kelimeler)
     {
     asd=[row valueForKey:@"col_2"];
     olabel1.text=asd;
     }


    [database commit];
    [database close];

    }

Ответы [ 4 ]

0 голосов
/ 16 июня 2011

Иногда, особенно с базами данных, просто очистка не работает !!!

Перейти в каталог: / Пользователи / qjsi / Библиотека / Поддержка приложений / iPhone Simulator / 4.3 / Приложения

Там вы найдете все запущенные вами проекты. Найдите папку с проектом, над которым вы работаете, и удалите его. Затем очистите ваш проект через Xcode, затем запустите. Папка в этом каталоге будет воссоздана, как и база данных.

ПРИМЕЧАНИЕ. База данных также будет удалена! Если он сохранен в вашем комплекте и скопирован в редактируемый каталог, обратите внимание, что база данных будет такой же, как и в вашем комплекте (то есть без измененных записей, сделанных в iPhone Simulator).

0 голосов
/ 27 августа 2010

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

- (void)createEditableCopyOfDatabaseIfNeeded {
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
//NSLog(writableDBPath);
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
    NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}

}

- (void)initializeDatabase {
// The database is stored in the application bundle. 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
// Open the database. The database was prepared outside the application.
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
    //Add initial sql statements here

} else {
    // Even though the open failed, call close to properly clean up resources.
    sqlite3_close(database);
    NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
    // Additional error handling, as appropriate...
}

}

- (sqlite3*) getDB{
return database;

}

Вставьте вызовы в ваш applicationDidFinishLaunching метод

0 голосов
/ 13 сентября 2010

Насколько я помню, когда вы используете путь для БД, как вы это делаете, он должен быть добавлен в проект.

0 голосов
/ 27 августа 2010

Вам необходимо программно скопировать вашу базу данных в Documents каталог приложения и работать с доступной для записи копией.Ресурсы в комплекте только для чтения.

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