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

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

Нужно ли создавать файл заранее или как это делается на устройстве во время выполнения?

Просто хранить 2 массива на устройстве где-нибудь с правильным путем и загружать / обновлять его, когданеобходимо.Я попробовал несколько вещей, но не смог заставить его работать.

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

NSUserDefaults действительно очень прост в использовании для реализации постоянных данных для вашего приложения, если ваши данные находятся в структурах данных NS *, таких как NSDictionary или NSArray.Если ваши данные не слишком велики, используйте NSUserDefaults.Я обычно создаю метод "save", который я вызываю из applicationWillTerminate, делегата приложения, и метод загрузки, который я вызываю из application:didFinishLaunchingWithOptions:

#define kThing1Key @"thing1"
#define kThing2Key @"thing2"
...

- (void) save
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:self.thing1 forKey:kThing1Key];
    [defaults setObject:self.thing2 forKey:kThing2Key];
    ...
    [defaults synchronize];
}

- (void) load
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    self.thing1 = [defaults objectForKey:kThing1Key];
    self.thing2 = [defaults objectForKey:kThing2Key];
    ...
}
1 голос
/ 13 июля 2010

Я настоятельно рекомендую использовать какую-либо базу данных для сохранения таких данных, либо Core Data, либо SQLite.С помощью SQLite (моя сильная сторона) вы можете оставить файл базы данных открытым, сохранив изменения в массиве транзакционно.Существует очень мало шансов, что что-то пойдет не так, благодаря механизму журналирования SQLite и его потрясающе тщательному режиму тестирования .Базовые данные основаны на SQLite, поэтому применяются те же гарантии.

РЕДАКТИРОВАТЬ (RE: comments):

Избыточность является проблемой только в тех случаях, когда стоимость решения чрезмерна для этой проблемы.решаетсяSQLite просто сидит без дела, прося, чтобы его использовали.Во-первых, вы можете создать структуру данных для более осмысленного представления данных:

@interface Memo {
    NSString *title;
    NSString *textBody;
};
@property (nonatomic, retain) title;
@property (nonatomic, retain) textBody;
@end

@implementation Memo
@synthesize title, textBody;
@end

Необработанный интерфейс SQLite немного неуклюж, так что я бы сохранил и загрузил их, используя C ++ библиотеку-оболочку для простоты:

- (NSString *)databasePath {
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    // Choose a filename for your database.
    return [documentsDir stringByAppendingPathComponent:@"data.db"];
}

- (void)saveMemos:(NSArray *)memos {
    try {
        sqlite3_connection con([[self databasePath] cStringUsingEncoding:NSUTF8StringEncoding]);
        con.executenonquery("CREATE TABLE IF NOT EXISTS memo (i, title, textBody)");

        sqlite3_transaction trans(con);
        {
            sqlite3_command cmd(con,
                "INSERT INTO memo (i, title, textBody) VALUES (?, ?, ?)");
            for (int i = 0; i < memos.count; i++) {
                Memo *memo = (Memo *)[memos objectAtIndex:i];
                cmd.bind(1, i);
                cmd.bind(2, [memo.title cStringUsingEncoding:NSUTF8StringEncoding]);
                cmd.bind(3, [memo.textBody cStringUsingEncoding:NSUTF8StringEncoding]);
                cmd.executenonquery();
            }
        }
        trans.commit();
    } catch(exception &ex) {
        NSLog(@"SQLite3 error: %s", ex.what());
    }
}

- (NSMutableArray *)loadMemos {
    sqlite3_connection con([[self databasePath] cStringUsingEncoding:NSUTF8StringEncoding]);
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:10];
    if (con.executeint("SELECT COUNT(*) FROM sqlite_master WHERE name = 'memo'")) {
        sqlite3_command cmd("SELECT title, textBody FROM memo ORDER BY i");
        sqlite3_reader rd = cmd.executereader();
        while (rd.read()) {
            Memo *memo = [[Memo alloc] init];
            memo.text = [NSString stringWithFormat:@"%s", rd.getstring(0).c_str()];
            memo.titleBody = [NSString stringWithFormat:@"%s", rd.getstring(1).c_str()];
            [result addObject:memo];
        }
    }
    return result;
}

(ВНИМАНИЕ: Этот код полностью не проверен.)

Маловероятно, что формат файла, созданный на дому, потребует меньше кода, чем этот, ипочти наверняка он будет менее надежным.

Вам также следует учитывать Базовые данные, но я сам ими не пользовался, поэтому не могу предложить помощь на этом фронте.

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