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

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第七讲)

默认是第一种键盘模式,当需要切换模式,进入到ta_event_cb函数修改模式,下面代码以数字模式举例子lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER);在该界面中可以设置键盘文字的大小和文本类型,最下方判断键盘是否支持中文输入(中文输入,当汉字库不够大时,用户点击中文输入会少很多字)。//当LV_USE_KEYBOARD为1时启用虚拟键盘,LV_USE_ZH_KEYBOARD为1时支持中文输入。随后在系统设置界面中点击项目选项,选择显示键盘。

weixin_38828382的博客 1416

iOS CoreData的使用

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

假装你是大灰狼的专栏 6722

【OpenClaw 实战】Ubuntu 双机 Gateway + Node 部署全流程 + 所有常见坑(2026版)

如果你只是需要浏览器自动化、截屏、简单系统查询 →Node 模式够用,别折腾 exec。如果你需要 GOLD 运行任意 shell 命令、git、npm、自定义脚本 →必须升级成 Gateway。bind lan + pairing approve + token 统一。后续想玩多 Agent 团队,优先考虑双/多 Gateway + 聊天通道互发(社区已有不少成功案例)。欢迎评论区留言你的环境和报错,一起交流!

hampeter的博客 1547

深入浅出MagicalRecord(4)

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

我叫MT 642

保姆级教程:从Salmon输出到DESeq2,搞定RNA-seq表达矩阵标准化与下游分析准备

本文提供从Salmon输出到DESeq2标准化的RNA-seq数据分析全流程指南,详细解析表达矩阵构建、标准化方法选择及下游分析准备。重点介绍如何将Salmon定量结果转换为DESeq2兼容格式,包括TPM与原始计数的处理技巧,以及常见问题排查方法,帮助研究人员高效完成RNA-seq数据分析。

weixin_42699679的博客 304

MRST开源油藏模拟:从入门到精通的全流程指南

本文全面介绍了MRST开源油藏模拟工具的使用方法,从环境搭建到核心功能实战,再到性能优化和工业级应用。MRST作为一款基于MATLAB的开源工具,为油藏工程师提供了强大的数值模拟能力,特别适合教学和科研场景。文章还分享了二次开发技巧和常见问题解决方案,帮助读者快速掌握油藏模拟技术。

beer8的博客 326

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

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

weixin_34174322的博客 450

国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)

国科大学习资料–人工智能原理与算法-2020年期末考试题解析 张文生老师主讲 试卷共有6道题,题目不难,希望大家能取得好的成绩。 3.9 传教士和野人问题。三个传教士和三个野人在河的一岸,有一条能载一个人或者两个人的船。请设法使所有人都渡到河的另一岸,要求在任何地方野人数都不能多于传教士的人数。这个问题在AI领域中很有名,是因为它是第一个从分析的观点探讨问题形式化的论文的主题(Amarel,1968)。 a. 请对该问题进行详细形式化,只描述确保该问题求解所必需的特性。画出完整的状态空间图。 b. 应用合适

无名何许人的博客 4786

ORACLE 第 4 章

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

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

scratch绘制旋转彩球 2023年9月电子学会图形化编程scratch编程等级考试四级真题和答案解析

​ scratch绘制旋转彩球 2023年9月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 1、准备工作 (1)删除小猫角色,从角色库选择Ball角色; (2)默认空白背景。 ​

青少年编程学习指导 1367

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5916

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

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

weixin_33428613的博客 214

T型三电平逆变器中点电位平衡详解

T型三电平逆变器(T-type Three-Level Inverter)是一种高效的多电平拓扑,相比传统NPC(Neutral Point Clamped)三电平逆变器,具有更低的开关损耗、更高效率和更简单的结构,尤其适用于中功率应用(如光伏逆变器、风电变换器和工业驱动)。(T-type Three-Level Inverter)中的应用已成为当前中高压功率变换领域(如光伏逆变器、储能PCS、电动汽车充电桩、风电并网和工业驱动)的热门方案。针对 T型逆变器,类似 NPC 的零序注入法适用。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 545

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

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

www.itmmd.com 377

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入浅出MagicalRecord-04

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

为你超神 829

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、付费专栏及课程。

余额充值