Как сделать объект и правильно использовать coredata? - PullRequest
0 голосов
/ 05 сентября 2011

У меня 5000 пар района и города.Я хочу поставить эти 5000 районов в coredata.У каждого района есть город, и у каждого города может быть много районов.У меня 2 субъекта, а именно районы и ситапа.Как мне сделать это эффективно?

for (int i=0; i<[IndonesiaDistrictToSave count]; i++) {

    int index;
    for (int j=0; j<[[IndonesiaDistrictToSave objectAtIndex:i] length]; j++) {
        if([[IndonesiaDistrictToSave objectAtIndex:i] characterAtIndex:j]==','){
            index=j;
        }
    }

    NSString * DistrictName=[[IndonesiaDistrictToSave objectAtIndex:i] substringToIndex:index];
    NSString * CityName=[[IndonesiaDistrictToSave objectAtIndex:i] substringFromIndex:index+1];

    District * theDistrict = (District *)[GrabClass getObjectWithStringOfValue:DistrictName fromTable:@"District" withAttribut:@"Name"];
    theDistrict.City= (City *)[GrabClass getObjectWithStringOfValue:CityName fromTable:@"City" withAttribut:@"Name"];
}

getObjectWithStringOfValue - это метод для поиска, если объект уже существует, он вернет его, но если объект не существует, он будет создан новым, иверните его

, а затем я использую этот код для сохранения всех районов Индонезии, существует более 4500 районов. Если я использую временной интервал, я получаю 0,013773 для каждого района, но он все еще медленный, как я могу сделатьбыстрее?

Есть ли способ получить изменяемый прокси-массив для результата поиска?

1 Ответ

1 голос
/ 06 сентября 2011

Поскольку вы, похоже, думаете о своих сущностях как о таблицах sql, я сомневаюсь, что ваша выборка настроена эффективно.

Базовые данные - это не SQL.Сущности не являются таблицами.Объекты не являются строками.Атрибуты не являются столбцами.Отношения не объединяются.Базовые данные - это система управления графом объектов, которая может сохранять или не сохранять объектный граф, а может и не использовать SQL для этого далеко за кулисами.Попытка думать о базовых данных в терминах SQL приведет к тому, что вы полностью неправильно поймете базовые данные и приведете к большим трудностям и потерянному времени.

Если у вас есть набор потенциальных значений атрибутов для поиска, используйте оператор INв предикате, чтобы найти все совпадения, например

NSArray *newName=[NSArray arrayWithObject:@"Tom",@"Dick",@"Harry",nil];
NSPredicate *p=[NSPredicate predicateWithFormat:@"name NOT IN %@",newName];

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

...