目标:利用coreData实现对网络歌曲信息的记录,并根据其信息下载歌曲到本地。
UI设计:
代码设计:
//向数据表中添加数据
- (IBAction)collectMusic:(UIButton *)sender {
[DBManager music_insertNetItem:@"Music"andData:_musicDatamanagedObjectContext:self.myAppDelegate.managedObjectContext];
[self downloadMusic:_musicData.songID andMusicName:_musicData.trackname];
}
当点击加号按钮时,我们会把该行cell中的信息用coreData提供的接口写入到SQLite数据文件中。
所以我们得先做好准备工作。
新建一个coreData类型的文件dataModel,取名CollectDataModel
打开该文件,新建一个Entity,名为Music,添加属性,
CoreData基本概念:
CoreData提供了一种简便的对象持久化管理方法,使你可以不用关心数据的存储,只需要关心对象的增加、删除、更改、读写。
托管对象(managed object)
一个托管对象代表你想要保存到数据存储中的一个对象。这在概念上类似于SQL中的一条记录, 并且通常也包含一些域,这些域对应于你想要保存的对象的属性。
数据存储(data store)
Core Data支持4中类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore。
使用CoreData
2 有了托管对象模型实例之后,我们就可以创建一个持久化协调器实例了。持久化协调器处理到数据存储的连接。大概是处理怎么把对象写到数据存储或怎么从数据存储读对象吧。
3 有了持久化协调器实例之后,我们需要提供一个数据存储给它管理。你可以通过发送addPersistentStoreWithType:configuration:URL:options:error:消息来实现。
4 最后一步就是实例化托管对象上下文。有了托管对象上下文,你就可以方便的管理对象了。
coreData代码:
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managedObjectModel;
}
创建一个托管对象模型,若有就返回该对象,反之,就创建一个托管对象。- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *storeURL = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"TestCoreData.sqlite"]];
NSLog(@"path is %@",storeURL);
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Error:%@,%@",error,[error userInfo]);
}
return _persistentStoreCoordinator;
}
创建持久化协调器对象,当然会用到托管对象,并且创建SQLite的数据文件,创建好持久化协调器之后将它与数据文件给它管理。DBManager类:用于数据的管理
//添加数据
+ (void)music_insertNetItem:(NSString *)EntityName andData:(MusicData *)musicData managedObjectContext:(NSManagedObjectContext *)context{
//获得数据中的实体
Music *music = (Music *)[NSEntityDescription insertNewObjectForEntityForName:EntityName inManagedObjectContext:context];
//对实体Music对象进行添加数据
[music setTrackname:musicData.trackname];
[music setAlbumname:musicData.albumname];
[music setLogoname:musicData.logoname];
NSLog(@"%@\n%@\n logoname:%@\n",music.trackname,music.albumname,music.logoname);
NSError *error;
BOOL isSaveSuccess = [context save:&error];
if (!isSaveSuccess) {
NSLog(@"Error:%@",error);
}else{
NSLog(@"Save successful!");
}
}
这样就完成了对数据的插入操作,每点击一行的加号按钮后,会把改行的信息写入后方SQLite的数据文件中。@property (nonatomic,strong) NSString *songID;
在方法:+ (void)fetchSongDetailInfo:(id)item callback:(fetchDetailSongInfoCallback)callback;
songID = [[[itemDictionary objectForKey:@"songs"]firstObject]objectForKey:@"mp3Url"] ;
//把值与key相联
[item setValue:songID forKey:@"songID"];
接着我们需要的就是下载工作。- (void)downloadMusic:(NSString *)musicPath andMusicName:(NSString *)name{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL *url = [NSURL URLWithString:musicPath];
NSData *data = [NSData dataWithContentsOfURL:url];
//将数据保存到本地指定位置
NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3", docDirPath , name];
NSLog(@"%@",filePath);
[data writeToFile:filePath atomically:YES];
});
}
到相应的地址去看,你会看到