Должен ли я использовать plist, SQLite или NsMutableArray? - PullRequest
0 голосов
/ 31 октября 2009

Если я хочу сохранить 2 строки и ABContact изображение (или переменную для вызова изображения), которые сохраняются даже после перезапуска приложения, какой метод мне следует использовать? NsMutableArray, plist или SQLite?

Ответы [ 4 ]

4 голосов
/ 31 октября 2009

Для очень небольших объемов данных, таких как несколько строк, но не изображение, вы также можете использовать гораздо более простые NSUserDefaults. Обычно это для сохранения настроек или некоторых постоянных данных.

Чтобы сохранить это:

[[NSUserDefaults standardUserDefaults] aString forKey:@"aStringKey];
if (![[NSUserDefaults standardUserDefaults] synchronize])
    NSLog(@"not successful in writing the default prefs");

Чтобы прочитать это:

aString =  [[NSUserDefaults standardUserDefaults] stringForKey:@"aStringKey];

Опять же, я бы не стал использовать это, если вам действительно нужна база данных или файловая система.

Если вы вводите больше данных, но их недостаточно для гарантии базы данных SQL или Core Data, тогда я бы записал эти данные в файл plist. Если все ваши данные являются объектами, то я бы сделал это:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:kSavedDocFileName]; 
    NSMutableArray *myArrayToSave = [[NSMutableArray alloc] arrayWithCapacity: 48];
// 48 since you said in the comments that you have 48 of these
    for (int i = 0; i < 48; i++) {
        NSDictionary *myDict = [[NSDictionary alloc] initWithObjectsAndKeys:
                            sting1[i], @"firstStr", //I'm assuming your strings are in a C array.
                            string2[i], @"secondStr",// up to you to replace these with the right 
                            url[i], @"myURL",       //way to access your 48 pieces of data
                            nil];
        [myArrayToSave addObject:myDict];
        [myDict release];
    }
    if (![myArrayToSave writeToFile:path atomically:YES])
        NSLog(@"not successful in saving the unfinished game");

И вы можете прочитать данные:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:kMySavedDocName];
    NSArray *myLoadedData = [[NSArray alloc] initWithContentsOfFile:path];

    for (int i = 0; i < 48; i++) {
        NSDictionary *myDict = [myLoadedData objectAtIndex:i];
        string1[i] = [myDict objectForKey:@"firstStr"];
        string2[i] = [myDict objectForKey:@"secondStr"];
        url[i] = [myDict objectForKey:@"url"];

    }
    [myLoadedData release];

Удостоверьтесь, что вы не просто копируете и вставляете этот код, поскольку я просто набрал его на макушке.

Теперь, если вы не хотите связываться со словарем, вы тоже можете это сделать. Это немного менее элегантно:

Сохранение:

    NSMutableArray *myArrayToSave = [[NSMutableArray alloc] arrayWithCapacity: 48 * 3];
// 48 since you said in the comments that you have 48 of these three objects
    for (int i = 0; i < 48; i++) {
        [myArrayToSave addObject:string1[i]];
        [myArrayToSave addObject:string2[i]];
        [myArrayToSave addObject:url[i]];
    }
    if (![myArrayToSave writeToFile:path atomically:YES])
        NSLog(@"not successful in saving the unfinished game");

Нагрузка:

NSArray * myLoadedData = [[NSArray alloc] initWithContentsOfFile: path];

for (int i = 0; i < 48; i++) {
    string1[i] = [myLoadedData objectAtIndex:i * 3];
    string2[i] =  [myLoadedData objectAtIndex:i * 3 + 1];
    url[i] =  [myLoadedData objectAtIndex:i * 3 + 2];

}
[myLoadedData release];

Еще одно важное замечание: во всех этих примерах я предполагаю, что вы имеете дело с объектами (48 из них 3). Вот почему вы можете просто добавить их в словари и массивы, сохранить их и легко перезагрузить. Если вы имели дело с необъектами, такими как int, или c-строками, или BOOL, то вам придется использовать [NSNumber ...], чтобы превратить их в объекты, а затем [object ...], чтобы превратить их в не-объекты. ojects для начала.

Попробуйте некоторые из них, а затем найдите папку своего приложения в ~ / Library / Application Support / iPhone Simulator / Applications и найдите в папке Documents, откройте сохраненный файл и проверьте его содержимое. Всегда приятно проверять записываемые вами данные и видеть, как различные методы изменяют содержимое.

Удачи!

4 голосов
/ 31 октября 2009

NSMutableArray не будет сохраняться после перезапуска приложения.

Возможно, вы захотите посмотреть список, в котором хранятся две строки, и URL-адрес файла, указывающий на изображение адресной книги, которое кэшируется в изолированной программной среде «Документы» приложения.

Если у вас есть много таких файлов для хранения и извлечения между перезапусками приложения, посмотрите Core Data.

1 голос
/ 31 октября 2009

Не делайте базы данных. Это слишком много для этих маленьких данных. Плист будет хорошо. Вы, вероятно, не должны использовать NSUserDefaults, я думаю, что это прямо на границе слишком большого количества данных для него. Просто запишите plist в каталог документов внутри вашего приложения и загрузите его при перезапуске приложения. Вы можете хранить NSMutableArray в plist, но он возвращается к вам как NSArray. Просто заново создайте его как изменяемый массив с помощью [NSMutableArray arrayWithArray:] и сохраните его.

0 голосов
/ 02 ноября 2009
  • (void) doneAceSpadeSetupClick: (id) отправитель {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *string1;
    NSString *string2;
    NSString *string3;
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"card1.plist"]; 
    NSMutableArray *myArrayToSave = [[NSMutableArray alloc] initWithCapacity: 1];
    //48 since you said in the comments that you have 48 of these
    
          NSDictionary *myDict = [[NSDictionary alloc] initWithObjectsAndKeys:
             string1, characterText.text, //I'm assuming your strings are in a C array.
            string2, actionText.text,// up to you to replace these with the right 
                        string3, objectText.text,
                        nil]; //iPhone simulator crashed at this line
        [myArrayToSave addObject:myDict];
    
    if (![myDict writeToFile:path atomically:YES])
        NSLog(@"not successful in saving the unfinished game");
    
    
    
    [self dismissModalViewControllerAnimated: YES];
    

    }

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