CoreDataEnvir (с 2011-05-25), последняя версия 0.4
CoreDataEnvir — это оболочка CoreData, которая позволяет удобно использовать CoreData и обеспечивает потокобезопасность в параллельном программировании. Вы можете использовать её параллельно, запуская отдельный экземпляр CoreDataEnvir в одном потоке.
Первый шаг:
Зарегистрируйте имя файла вашей базы данных:
[CoreDataEnvir registDatabaseFileName:@"db.sqlite"];
Зарегистрируйте имя вашего файла модели (без расширения имени файла):
[CoreDataEnvir registModelFileName:@"SampleModel"];
Простой доступ к базе данных:
Предположим, что класс Book является моделью, представляющей объект книги в вашем приложении для чтения. У него есть некоторые поля, такие как name, author и т. д.
Существует автор «John Stevens Cabot Abbott», написавший книгу под названием «Napoleon Bonnaparte».
Добавление новой записи:
[Book insertItemWithFillingBlock:^(id item) {
item.name = @"CoreData tutorial";
item.author = @"Headwindx";
}];
Извлечение множества записей:
//Найти все книги Джона Стивенса Кэбота Эбботта.
NSArray *books= [Feed itemsWithFormat:@"author = %@", @"John Stevens Cabot Abbott"];
Получение одной записи:
//Найти один объект модели книги.
Book *book = [Book lastItemWithFormat:@"name = %@ && author = %@", @"Napoleon Bonnaparte", @"John Stevens Cabot Abbott"];
Удаление одной записи:
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[db deleteDataItem:book];
}];
Удаление записей:
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[db deleteDataItemSet:books];
}];
Параллельное программирование:
В основном потоке:
Вы можете выполнять лёгкие операции в основном потоке. Все вышеперечисленные операции должны выполняться в основном потоке по умолчанию, иначе будет вызвано исключение CoreDataEnvir
. Поэтому вам следует быть осторожным.
Это позволит вам чувствовать себя более уверенно :-)
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[Book insertItemWithFillingBlock:^(id item) {
item.name = @"CoreData tutorial";
item.author = @"Headwindx";
}];
}];
На фоновом потоке:
Для вас уже подготовлена фоновая очередь GCD в CoreDataEnvir
.
Блок asyncBackgroundInBlock
сохранит кэш памяти в файл db после завершения работы void(^)(CoreDataEnvir *)
.
Вам не нужно использовать [db saveDataBase]
как в старой версии.
[CoreDataEnvir asyncBackgroundInBlock:^(CoreDataEnvir *db) {
[Book insertItemOnBackgroundWithFillingBlock:^(id item) {
item.name = @"CoreData tutorial";
item.author = @"Headwindx";
}];
}];
Это становится более удобным при параллельном программировании.
Удобные методы:
Должны выполняться в основной очереди:
+ (void)asyncMainInBlock:(void(^)(CoreDataEnvir *))CoreDataBlock;
+ (id)insertItemWithFillingBlock:(void(^)(id))fillingBlock;
+ (NSArray *)itemsWithFormat:(NSString *)fmt,...;
...Должны выполняться в фоновой очереди, вы можете использовать эти API и некоторые методы с именем Background
:
+ (void)asyncBackgroundInBlock:(void(^)(CoreDataEnvir *))CoreDataBlock;
+ (id)insertItemOnBackgroundWithFillingBlock:(void(^)(id))fillingBlock;
+ (NSArray *)itemsOnBackgroundWithFormat:(NSString *)fmt,...;
...Или вы хотите выполнить какую-либо операцию в своей собственной очереди отправки, вы можете выбрать следующие API:
+ (CoreDataEnvir *)createInstance;
лучше сохранить этот экземпляр для будущего использования.- (void)asyncInBlock:(void(^)(CoreDataEnvir *))CoreDataBlock;
Если вы новичок в CoreData, пожалуйста, соблюдайте следующие правила:
Если вы хотите сохранить объекты NSManagedObject, вам не следует освобождать объект CoreDataEnvir, иначе он выйдет из строя.
Если вы работаете с базой данных в нескольких потоках, убедитесь, что у вас есть один NSManagedObjectContext в отдельном потоке или очереди GCD. Иначе может возникнуть конфликт, когда один поток читает данные, а другой записывает данные.
PS: Таким образом, в CoreDataEnvir убедитесь, что ваш объект NSManagedObject получен из [CoreDataEnvir mainInstance] в основном потоке или...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )