IOS开发学习笔记(二十)——Core Data使用(中篇)

CoreData 多线程下NSManagedObjectContext的使用 本人去年10月份才接触IOS项目的,项目中用到了CoreData,由于需要调用子线程进行API请求,所以需要在子线程中使用NSManagedObjectContext进行数据的增删改查。因此当时百度了很多相关东西,但是没有得到我要的答案,后来硬着头皮Google了很多英文博客和论坛(本人英文水平其实还可以,英文文档看起来也没那么吃力,但总归不是母语,到现在都有一种抵触感),研究的也是一知半解,由于 阅读详情

上一篇文章我们从一个小例子讲解了Core Data的使用方式,其实尽管概念很多,但实际应用的时候大多数情况下我们不需要接触太多的类和方法,只要拿到context并且操作即可。


这次我们看看iOS自带的一个小例子,原文参见:Core Data Tutorial for iOS。由于上一次我们已经讲述了基本概念和实现方法,这次我的描述会简练一些,不再一步一步详细讲解。


本次目标是创建一个应用程序,可以记录每次你保存的经纬度坐标,并且可以对这些坐标(我们保存为一个Event实体)进行编辑。


我的演示环境是XCode 4.6.3,所以有些地方和原文是不同的,这里都已我自己的环境为准。


建立工程

步骤

  1. 创建一个Empty Application,起名叫Locations,选择Devices为iPhone,并且使用ARC;
  2. 添加CoreLocation.framework;
  3. 添加一个Storyboard文件,并在工程属性中选择Main Storyboard为这个文件;
  4. 至此,操作步骤完成。

对工程的理解

以上步骤完成后,我们的工程中多了很多文件,我们一一讲解如下:

  1. 应用的代理类AppDelegate(.h和.m文件);
  2. 一个.xib界面描述文件;
  3. 一个Core Data的模型文件.xcdatamodelId;
  4. 这个工程还引用了CoreLocation.framework;

我们还能看到对于AppDelegate.h,会自动生成相关Core Data的处理:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

就像方法暗指的那样,applicationDocumentsDirectory方法返回的是app的文档路径,数据将被保存在那里。


Core Data Stack

这里的stack指的是Core Data framework中一系列对象的集合,这些对象协同工作,将模型从文件中取出,或者写入到文件中。从类比的角度说,Core Data可以被看为一个数据库,保存了记录和表(Core Data中的数据有可能真的被保存在数据库中,例如SQLite,但是这个不是一定的)。一个最简单和最频繁使用的Core Data Stack结构如下(可以和上一篇文章印证):


其中你最常用的是Managed Object Context和其包含的Managed Object对象。


Managed Object和Managed Object Context

Managed Object是一个NSManagedObject或者他的子类的对象。他代表了在Store中保存的一个对象的记录,所以他是一个由Core Data管理的模型。Managed Object对象管理应用中使用的数据,例如:一个人力资源管理系统中的部门和雇员信息;一个绘图程序中的形状、文本和分组信息;一个音乐程序中的音轨信息。一个Managed Object始终和一个Managed Object Context相关联。


Managed Object Context是一个NSManagedObjectContext类的实例。一个context代表了一个应用中与数据有关的内存区域。context的主要职责是用来管理managed object对象。Context对象是你的应用的控制中枢,负责生命周期管理到验证、Managed Object间的关系维护、重做和取消等功能。


当你新建一个Managed Object的时候,首先要将其放入Context中。你将对象取回(fetch)的时候,同样将其存入context对象。所有的操作都在内存中,一直到你通过commit提交你的修改为止。


下面的图演示了记录(record)和对象(object)的关系,注意有个Nigel对象没有保存,所以Store中的salary仍然是50000,另外有两个对象未纳入context管理。



Managed Object Model

Managed Object Model是一个NSManagedObjectModel类的实例,他描述了数据库的Schema,所以你的数据能够保存到Store中。一个模型(model)是一个实体对象模型(NSEntityDescription)的集合。一个实体描述根据实体的名字描述一个实体,类名,及其属性。


下图描述了模型的实体描述、数据库中表和Managed Object中单个对象的关系:



每个Managed Object都有对应的实体描述。

Core Data使用模型来在应用的managed object和数据库的记录中描述映射关系。所以一定要对改变模型(描述)小心处理。Core Data无法使用你之前的模型来使用现在的数据。(实际上需要通过版本管理来处理这种变更,而不是完全不能处理)


Persistent Store Coordinator

PSC扮演的角色是告诉Core Data如何管理数据。大多数时候你完全不用关心这个对象。


一个PSC是NSPersistentStoreCoordinator类的一个实例,他管理了一系列的persistent object store。一个persistent object stores代表一个需要序列化的外部文件或数据库。实际上Core Data支持多种持久化数据类型,甚至你可以声明自己的数据文件类型。


在iOS中,一般你仅有一个store,但在复杂的应用(例如OSX)中你可能有多个保存实体的store,所以PSC需要来管理这些store,当你需要取回数据时,PSC将取回所有结果。


下图模拟了coordinator的工作角色,实际情况通常不会这么复杂:




Table View Controller

这一小节主要实现Table View Controller相关功能。下面我们一步一步来执行以下步骤,:

  1. 在Storyboard中创建一个Table View,并将其嵌入到Navigation Controller中;
  2. 添加两个按钮到Navigation Bar上面,并且将左边按钮的Identifier改为Edit,右边Identifier修改为Add;
  3. 添加一个UITableViewController的子类,名字为LocationsListViewController;
  4. 添加对位置信息的支持,所以LocationsListViewController的头文件变为:
    #import <UIKit/UIKit.h>
    #import <CoreLocation/CoreLocation.h>
    
    @interface LocationsListViewController : UITableViewController <CLLocationManagerDelegate>
    
    @property (nonatomic, retain) NSMutableArray *eventsArray;
    @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
    
    @property (nonatomic, retain) CLLocationManager *locationManager;
    @property (nonatomic, retain) UIBarButtonItem *addButton;
    
    @end

  5. 实现文件中对于location获取相关代码实现如下:
    @implementation LocationsListViewController
    
    @synthesize eventsArray;
    @synthesize locationManager;
    @synthesize managedObjectContext;
    @synthesize addButton;
    
    
    - (CLLocationManager *)locationManager {
        
        if (locationManager != nil) {
            return locationManager;
        }
        
        locationManager = [[CLLocationManager alloc] init];
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
        locationManager.delegate = self;
        
        return locationManager;
    }
    
    - (void)locationManager:(CLLocationManager *)manager
        didUpdateToLocation:(CLLocation *)newLocation
               fromLocation:(CLLocation *)oldLocation {
        addButton.enabled = YES;
    }
    
    - (void)locationManager:(CLLocationManager *)manager
           didFailWithError:(NSError *)error {
        addButton.enabled = NO;
    }
    
    - (id)initWithStyle:(UITableViewStyle)style
    {
        self = [super initWithStyle:style];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // Set the title.
        self.title = @"Locations";
        
        // Set up the buttons.
        self.navigationItem.leftBarButtonItem = self.editButtonItem;
        
        addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                  target:self action:@selector(addEvent)];
        addButton.enabled = NO;
        self.navigationItem.rightBarButtonItem = addButton;
        
        // Start the location manager.
        [[self locationManager] startUpdatingLocation];
    }

    这里剩下addEvent未实现。
  6. 接着我们去AppDelegate类,将didFinishLaunchingWithOptions修改为:
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        return YES;
    }

  7. 至此,本阶段工作完成,运行程序显示如下界面:


Managed Object and Model

这一部分比较简单,步骤如下:

  1. 打开Locations.xcdatamodeld文件,Add Entity,名字叫Event;
  2. 分别添加属性如下图:

  3. 创建自定义的Managed Object类。原则上你可以直接使用NSManagedObject,但实际上大部分情况下都会使用他的子类,好处如下:
    • 从开发工具获得更好的支持。例如属性存取方法的自动完成、编译时类型和符号的检测等;
    • 支持实体的自定义方法。大多数情况下你希望实体提供特殊的逻辑,例如自定义的验证、或者衍生的属性等。例如,一个Person实体的hasDriversLicense属性在age属性不到17时不可能是true(所以会有一个校验),或者一个fullName方法返回的是firstName和lastName的一个合适的拼接。

  4. 我们选择Event这个Entity,然后新建一个文件,选择Core Data分类中的NSManagedObject subclass。

  5. 我们可以看到自动生成的代码中包含了Event这个实体映射的域模型了。


Adding Events

这一小节的目标是添加事件并且将其显示在ListView中。

  1. 在story board中将我们的list view和我们之前创建的LocationsListViewController相关联;
  2. 在LocationsListViewController中添加方法:
    - (void)addEvent {
        // Get the Current Location
        CLLocation *location = [locationManager location];
        if (!location) {
            return;
        }
        
        // Create and configure a new instance of the Event entity.
        Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];
        
        CLLocationCoordinate2D coordinate = [location coordinate];
        [event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];
        [event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];
        [event setCreationDate:[NSDate date]];
        
        // Save the New Event
        NSError *error = nil;
        if (![managedObjectContext save:&error]) {
            // Handle the error.
            NSLog(@"Save Event failed.");
            return ;
        }
        
        // Update the Events Array and the Table View
        [eventsArray insertObject:event atIndex:0];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                              withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }

  3. 其余涉及到Table View的显示代码如下(注意设置Table View的Cell的Identifier为Cell,区分大小写;同时将Cell的Style设置为Right Detail):
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [eventsArray count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // A date formatter for the time stamp.
        static NSDateFormatter *dateFormatter = nil;
        if (dateFormatter == nil) {
            dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
            [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
        }
        
        // A number formatter for the latitude and longitude.
        static NSNumberFormatter *numberFormatter = nil;
        if (numberFormatter == nil) {
            numberFormatter = [[NSNumberFormatter alloc] init];
            [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
            [numberFormatter setMaximumFractionDigits:3];
        }
        
        static NSString *CellIdentifier = @"Cell";
        
        // Dequeue or create a new cell.
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }
        
        Event *event = (Event *)[eventsArray objectAtIndex:indexPath.row];
        
        cell.textLabel.text = [dateFormatter stringFromDate:[event creationDate]];
        
        NSString *string = [NSString stringWithFormat:@"%@, %@",
                            [numberFormatter stringFromNumber:[event latitude]],
                            [numberFormatter stringFromNumber:[event longitude]]];
        cell.detailTextLabel.text = string;
        
        return cell;
    }
    

  4. 还要实现一个getManagedObjectContext的方法:
    - (NSManagedObjectContext *)getManagedObjectContext {
        NSManagedObjectContext *context = nil;
        id delegate = [[UIApplication sharedApplication] delegate];
        if ([delegate performSelector:@selector(managedObjectContext)]) {
            context = [delegate managedObjectContext];
        }
        return context;
    }

  5. 最后在viewDidLoad方法最末尾加上eventArray和context的初始化代码:
        eventsArray = [[NSMutableArray alloc] init];
        managedObjectContext = self.getManagedObjectContext;

  6. 运行程序,添加event看看效果。

Fetching Events

获取数据的步骤比较简单:

  1. 创建请求;
  2. 设置排序条件(可选);
  3. 执行查询;
  4. 将数据放到我们准备好的(可变)数组中;

具体代码如下,我们需要创建一个loadData方法,然后在viewDidLoad中执行loadData:

-(void)loadData
{
    // Create the Request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    // Set the Sort Descriptor
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    // Execute the Request
    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
        NSLog(@"error loading data");
    }
    // Finish Up
    [self setEventsArray:mutableFetchResults];
}


Deleting Events

删除操作主要是覆盖commitEditingStyle方法,删除Object、删除界面中的显示,代码如下:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the managed object at the given index path.
        NSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.row];
        [managedObjectContext deleteObject:eventToDelete];
        
        // Update the array and table view.
        [eventsArray removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
        
        // Commit the change.
        NSError *error = nil;
        if (![managedObjectContext save:&error]) {
            // Handle the error.
        }
    }
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }
}



至此,这个例子完成,运行即可查看效果。





RCE绕过实战:从PHP代码执行到Shell通配符的深度渗透技巧 远程代码执行(RCE)是Web安全领域的核心漏洞类型,攻击者通过注入恶意代码获取服务器控制权。其原理在于应用程序未对用户输入进行充分过滤,导致攻击者能够执行任意代码或系统命令。在实战中,WAF和输入过滤机制日益完善,因此深入理解编程语言特性和操作系统环境成为突破防线的关键。例如,通过PHP的字符串拼接、动态函数调用等特性,可以绕过关键字过滤;而利用Shell通配符(如*和?)和内部字段分隔符(如${IFS}),则能在系统命令执行层实现有效绕过。这些技术不仅适用于CTF竞赛,更能直接应用于真实环境的渗透测试与 阅读详情

相关推荐

Insert型SQL注入漏洞深度剖析:从原理到实战挖掘与防御

SQL注入是Web安全领域的核心威胁之一,其本质是攻击者通过构造恶意输入,欺骗后端数据库执行非预期的SQL指令。从技术原理上看,它源于应用程序未对用户输入进行充分验证和过滤,直接将用户可控数据拼接至SQL语句中执行。这种漏洞的技术价值在于,它直接绕过了应用层逻辑,实现了对数据库的底层操作,危害性极高。在常见的应用场景中,除了广为人知的查询(SELECT)型注入,数据写入(INSERT)操作同样潜藏着巨大风险,尤其在用户注册、内容发布、订单提交等涉及数据新增的功能点。本文聚焦于Insert型注入这一特定类型,

weixin_34208283的博客 407

iOS CoreData的使用和简介

什么是CoreData在现代应用开发中,关于做数据持久化处理中,越来越多的人使用CoreData.因为用苹果的话来说它可以节约30%—70%的代码量 .(对于这个说法,大家可以各抒起见,欢迎吐槽),当然,对比与其他几个数据持久化的操作(如:写入,归档,SQLite),个人认为还是有好多好处的,它对sqlite进行了分装,只能用在iphone上概念下面我们来看一下它的概念

hw的博客 1122

WebGoat 8.1靶场实战:SQL注入与路径遍历漏洞攻防演练

SQL注入和路径遍历是Web应用安全中最常见且危害极大的漏洞类型,它们分别源于未对用户输入进行充分验证和过滤。SQL注入的原理在于攻击者通过构造恶意输入,改变原始SQL查询的语义,从而窃取、篡改或破坏数据库中的数据。路径遍历则允许攻击者通过构造特殊的文件路径序列(如../),访问应用预期目录之外的敏感系统文件。这两种漏洞的技术价值在于,它们直接威胁到数据的机密性、完整性和可用性,是渗透测试和红蓝对抗中的核心攻击向量。在应用场景上,无论是电商、金融还是企业OA系统,只要涉及数据库交互或文件操作,都可能存在此类

深未来技术 507

iOS面试大全(不断更新)

1.property常见的字段有哪些,分别表示什么含义? assgin: 简单赋值,不更改索引计数(Reference Counting),常用于基础数据类; retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,常用于NSObject的子类; copy:建立一个索引计数为1的对象,然后释放旧对象,常用于NSString; weak和strong的区别:wea

yejiajun945的专栏 2167

【信息科学与工程学】【数据科学】 第四十四篇 数据湖 系列二 函数库01

2. 近似最近邻搜索(ANN): 通过HNSW等图索引模型加速,模型定义为构建一个层次化导航小世界图。依赖于消息队列(Kafka/Pulsar)、分布式文件系统(HDFS/S3)的客户端及连接库。依赖专门的向量检索库(如FAISS, Milvus)。管控目标: 召回率(Recall@K) > 95%,查询延迟 < 100ms。管控目标: < 1% (核心业务字段) 或 < 5% (一般字段)依赖数据处理框架(如Spark, Pandas)的核心统计函数。,通过牺牲精确性(ANN)来换取搜索速度的大幅提升。

weixin_49199313的博客 346

C/C++ 计算程序运行的时间

C/C++计算程序执行时间的方法,精度依次增加,推荐度也依次增加 1.#include <time.h> clock_t start, finish; double process_interval ; start=clock(); process(); //要计时的程序 finish=clock(); process_interval =(double)(finish-star...

stu_shanghui的博客 1020

iOS CoreData的使用

CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。 1. 创建CoreData 在文件创建区下,选择【Core Data】下的【Data Model】 输入CoreData的文件名Model.xcdatamodel Model.xcdatamodeld文件默认是Swift的,如果想要改成oc,可以在打开Model.xcdatamodeld文件,在右侧工具栏中修改。 2. 创建Entity CoreData文件下

假装你是大灰狼的专栏 6722

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4941

深入浅出MagicalRecord(4)

深入浅出MagicalRecord-04 存储的时机 一般情况下,我们应该在数据发生变化时就进行存储操作。有些应用选择在退出的时候存储,然而在大多数情况下这是不必要的。事实上,如果你只是当应用退出的时候进行存储,你有可能会丢失数据!如果你的应用崩溃了呢?用户会丢失他们改变的数据,这是很糟糕的体验,应该极力去避免出现这种情况。 如果你发现存储比较耗时,有下面几点你可以考虑下

我叫MT 642

微信自动化必备软件:inspect(获取微信界面元素)

SaveButton10015.2:1 ✅(合格)Passed ✅说明这个控件完全符合无障碍标准。

Ven%的博客 1381

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 183

Oracle字符串处理三剑客:REPLACE、REGEXP_REPLACE与TRANSLATE实战详解

在数据库开发与数据处理中,字符串的清洗、转换和格式化是核心且高频的操作。其原理在于通过内置函数对文本数据进行精确或模式化的匹配与替换,以实现数据的标准化与规范化。这项技术的价值在于能显著提升数据质量,支撑后续的数据分析、报表生成和系统集成。常见的应用场景包括数据清洗(如去除非法字符、统一格式)、敏感信息脱敏、以及数据格式转换等。本文聚焦于Oracle数据库中的三个关键字符串函数:REPLACE、REGEXP_REPLACE和TRANSLATE。通过对比它们的设计哲学与适用场景,并结合数据清洗、正则表达式模式

weixin_34174322的博客 450

在 SAP HANA XS Advanced 中用 InA 打通 Web 化分析数据访问:架构原理、部署步骤与实战指南

本文介绍了如何在SAP HANA环境中通过InA协议为XS Advanced应用和分析工具提供实时数据访问。主要内容包括:InA协议的作用是将HANA计算视图等模型通过HTTP(S)暴露为实时数据源;SAP HANA Analytics Adapter(xsahaa)是关键组件,负责协议转换和连接管理;部署包含本地和云端两种形式,均需建立XSA空间与租户数据库的映射;实施前需准备HDI容器、适配器构建和网络验证;安全方面通过XSA用户角色和HDI授权双重控制;文章还提供了与SAP Analytics Clo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 257

ORACLE 第 4 章

PL/SQL(Procedure Language/SQL)是 Oracle 对 sql 语言的过程化扩展,指 在 SQL 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有 过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合起 来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。子类型是另一种数据类型的子集,它称为基本类型。子类型具有与其基本类型相同的操作,但只有基本类型有效值的子集。PL/SQL预定义包STANDARD中的几个子类型。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 330

【测开求职】面试题:数据结构 吐血整理

本篇文章是笔者为准备研究生复试以及校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍数据结构的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他近30篇文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 7065

C++ 图像线特征提取(CannyLine算法+opencv3.4.6)

C++ 图像线特征提取(CannyLine算法+opencv3.4.6)

weixin_43896283的博客 1084

字符串算法Day9:双指针、边界控制与工程实战解析

字符串在编程中本质上是字符数组,但其操作常涉及双指针、边界控制与原地修改等底层原理。理解这些基础概念,是掌握字符串处理技术价值的关键。从字符串逆序输出到字符串比较、字符串转数字等高频操作,在算法题和工程实践中均有广泛应用。正确使用双指针遍历、处理字符数组边界、区分不同语言的字符串语义,能显著提升代码的健壮性。本文围绕字符串题单,深入拆解反转、替换、旋转等经典题型的解题套路,并结合C语言字符串函数与多语言工程场景,帮助读者建立从算法到实战的完整认知体系。

weixin_33428613的博客 214

OpenClaw Windows 安装指南

好的,我来一步一步带你在 Windows 上安装 OpenClaw。

m0_60605453的博客 549

逻辑表变量名提取:从SQL到Spark的元数据访问与自动化实践

在数据处理与数据工程领域,元数据是描述数据结构、类型和关系的核心概念,它构成了数据治理和自动化流程的基础。元数据的核心价值在于提供数据自描述能力,使系统能够理解数据内容,从而实现动态查询生成、数据质量校验和跨系统集成。从技术原理看,访问元数据通常通过数据库系统表、编程接口或特定API实现,例如SQL的INFORMATION_SCHEMA、Pandas的DataFrame.columns属性或Spark的DataFrame.schema方法。这些技术手段使得自动化脚本能够适应不同数据源,显著提升数据工程效率。

www.itmmd.com 377

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MagicalRecord(简化CoreData操作)

1.新建项目不勾选coredata 2.pod 'MagicalRecord' 3.新建模型文件 4.添加实体和属性 5.Create NSManagedObject subclass 6.增 Person *person1 = [Person MR_createEntity]; person1.firstname = @"Frank"; perso...

weixin_30279751的博客 122

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入浅出MagicalRecord-04

这节我们来一起学习下 MagicalRecord 对数据的存储,内容主要来自于 MagicalRecord的github资料。 存储的时机 一般情况下,我们应该在数据发生变化时就进行存储操作。有些应用选择在退出的时候存储,然而在大多数情况下这是不必要的。事实上,如果你只是当应用退出的时候进行存储,你有可能会丢失数据!如果你的应用崩溃了呢?用户会丢失他们改变的数据,这是很糟糕的体

为你超神 829

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ios中的coredata的使用

Core Data数据持久化是对SQLite的一个升级,它是ios集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类。    (1)NSManagedObjectModel(被管理的对象模型)            相当于实体,不过它包含 了实体间的关系     (2)NSManagedObjectContext(被管理的对象上下文)          操作实际

chen505358119的专栏 6万+

IOS开发学习笔记(十九)——Core Data使用(上篇)

本小节主要讲述Core Data相关方面的知识,以及如何使用。 Core Data基础知识 官方的说法是:Core Data is a schema-driven object graph management and persistence framework. 翻译过来的意思大概是:Core Data是一个模式驱动的对象图管理和持久化框架。 好吧,上面的字面意思不是很容易理解,

「行到水穷处,坐看云起时」 5096

IOS开发学习笔记(一)——ObjectC语言快速入门

需要学习IOS开发,首先需要掌握的是ObjectC语言。由于我之前接触过多年的C/C++和Java,所以很多地方我只需要理解ObjectC和他们的不同即可。当然为了能够系统的学习,建议您还是仔细学习一遍ObjectC语言,我这里并不会讲述太多原理方面的内容,只会尽量将实际编码中需要注意的内容列出: 基本的关键字,类似于for/case/switch等等,大家都是差不多的;“@”标识符标识

「行到水穷处,坐看云起时」 4960

IOS开发学习笔记(二十一)——Core Data使用(下篇)

本篇主要讲述一些细枝末节的知识点。 建模 属性和关系 在XCode中,建模时就可以添加属性和标识实体间的相互关系。具体参见下图,下面还有对应说明: Entities中列举了实体的列表;每个Entity的属性列表在Attributes中,注意Attributes可以多选之后在右边一起改属性类型;通过添加关系可以标识出两种不同类型的Entity之间的相互联系;每

「行到水穷处,坐看云起时」 3974
上一篇: IOS开发学习笔记(十九)——Core Data使用(上篇)
下一篇: IOS开发学习笔记(二十一)——Core Data使用(下篇)
Soloman
博客等级 码龄25年 171粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值