• 工程日记之HelloSlide(3):如何使用Core Data数据库,以及和sqlite之间的对应关系


    Core Data 和 SQLite 是什么关系

    core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,core data不仅仅是把c的api翻译成oc的api,还提供了一些管理的功能,使用更加方便。

    1. App升级之后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作还是麻烦一些。

    2. CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。

    3. CoreData并不是直接操纵数据库,比如:使用CoreData时不能设置数据库的主键,目前仍需要手动操作。

       4. core data还有其他sql所不具备的优点,比如对undo的支持,多个context实现sketchbook类似的功能。为ManagedObject优化的row cash等

       5. 另外core data是支持多线程的,但需要thread confinement的方式实现,使用了多线程之后可以最大化的防止阻塞主线程。

       6. 效率上其实比较不出来感觉,因为手机程序的数据库比较小。

    与SQLite中的对应关系

    表格结构    --> NSEntityDescription  
    数据库中所有表格和他们的联系 -->NSManagedObjectModel  
    数据库存放方式 --> NSPersistentStoreCoordinator  
    数据库操作 --> NSManagedObjectContext  
    查询语句 --> NSFetchRequest  
    表格的记录 --> NSManagedObject  

    NSEntityDescription

    用来定义表格结构, 所以你就可以理解NSManagedObjectModel中的setEntities:(NSArray *)entities函数大概有什么用了 . 通常, 定义model, 是用文件CoreData.xcda*****odel, 可以图形化的操作. 这类似用nib来创建界面.  


    NSPersistentStoreCoordinator  

    这个类的对象通常用NSManagedObjectModel的对象来初始化, 这个类抽象出不同的存放方式, 最经常用的是NSSQLiteStoreType.  也就是一个负责把数据库存起来的引擎。

    NSManagedObjectContext  

    这个类的对象又用NSPersistentStoreCoordinator的对象来初始化, 它里面有些方法来添加, 删除NSManagedObject  

    NSFetchRequest  
    通常用NSEntityDescription来构造查询, 也就指定查询那个表格, 另外可以指定排序.  

    怎么查看底层的Sqlite数据库

    https://blog.csdn.net/xiliang_honst/article/details/7862153 

    func ifExists(instanceid id:Int)->Bool{
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
         
        //声明数据的请求
        let fetchRequest = NSFetchRequest<Composing>(entityName:"Composing")
        //fetchRequest.fetchLimit = 10 //限定查询结果的数量
        fetchRequest.fetchOffset = 0 //查询的偏移量
         
        //设置查询条件
        let requestString:String = "composingid = (id)"
        let predicate = NSPredicate(format: requestString, "")
        fetchRequest.predicate = predicate
         
        //查询操作
        do {
            let fetchedObjects = try context.fetch(fetchRequest)
            if(fetchedObjects.count == 0){
                return false
            }
            else{
                return true
            }
            
        }
        catch {
            fatalError("查询失败:(error)")
        }
    }

    Core Data怎么支持多线程?

  • 相关阅读:
    powerdesigner添加mysql的字符集ENGINE和DEFAULT CHARACTER SET
    powerdesigner怎么设置同时显示name和code
    更改gradle的java的class文件输出目录的结构
    使用TortoiseGit时如何实现SSH免密码登录
    TortoiseGit之配置密钥
    Mock InjectMocks ( @Mock 和 @InjectMocks )区别
    Centos tomcat jmx 远程连接
    【C++】常见易犯错误之数值类型取值溢出与截断(3)
    【C++】常见易犯错误之数值类型取值溢出与截断(2)
    【C++】常见易犯错误之数值类型取值溢出与截断(1)
  • 原文地址:https://www.cnblogs.com/Plorde/p/12312790.html
走看看 - 开发者的网上家园