iOS 数据存储 FMDB

FMDB有三个主要的类
 1. FMDatabase
    一个FMDatabase对象就代表一个单独的SQLLite数据库
    用来执行SQL语句
 
 2.FMResultSet
   使用FMDatabase执行查询后的结果集合

3.FMDatabaseQueue
   用于在多线程中执行多个查询或更新,它是线程安全的
 
 文件路径有三种情况
 1.具体文件路径
 如果不存在会自动创建
 
 2.空字符串@""
 会在临时目录创建一个空的数据库
 当FMDatabase连接关闭时,数据库文件也被删除
 
 3.nil
 会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

创建数据库和表

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong)FMDatabase * db;

- (IBAction)insertData:(id)sender;

- (IBAction)upData:(id)sender;

- (IBAction)deleteData:(id)sender;

- (IBAction)qurey:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //获取沙盒的路径
    NSString * filename=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"student.db"];

    //1.创建数据库实例对象
    self.db =[FMDatabase databaseWithPath:filename];

    //2.打开数据库
    if ([self.db open]) {
          NSLog(@"数据库打开成功!");
        //创建数据库表
      BOOL result=  [self.db executeUpdate:@"create table if not exists t_student(id integer primary key autoincrement ,name text,age integer)"];
        if (result) {

            NSLog(@"创建表成功!");
        }else{

            NSLog(@"创建表失败!");
        }

    }else{

        NSLog(@"数据库打开失败!");
    }

}

插入数据

//插入数据
- (IBAction)insertData:(id)sender {

    BOOL result=[self.db executeUpdate:@"insert into t_student (id ,name,age) values (?,?,?)",@3,@"胡星",@38];

    if (result) {

        NSLog(@"插入数据成功!");
    }else{

        NSLog(@"插入数失败!");
    }

}

//修改数据

//修改数据
- (IBAction)upData:(id)sender {

    BOOL result =[self.db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
    if (result) {
        NSLog(@"修改数据成功!");
    }else{

        NSLog(@"修改数据失败!");
    }
}

//删除数据

//删除
- (IBAction)deleteData:(id)sender {
    //删除指定姓名的人
    BOOL result=[self.db executeUpdate:@"delete from t_student where name=? ",@"赵三"];

    //删除所有
//    BOOL result =[self.db executeUpdate:@"delete from t_student"];

    if (result) {

        NSLog(@"删除成功!");
    }else{

        NSLog(@"删除失败!");
    }

}

//查询数据

//查询数据
- (IBAction)qurey:(id)sender {

    //查询指定姓名的信息
//    FMResultSet *rs =[self.db executeQuery:@"select * from t_student where name like ?",@"冯倩"];

    //查询所有信息
    FMResultSet *rs=[self.db executeQuery:@"select *from t_student "];
    //[rs next]会从顶部往下查询内容 一直到底部 返回值就会为NO
    while ([rs next]) {

        int ID =[rs intForColumn:@"id"];
        int age=[rs intForColumn:@"age"];
        NSString * name =[rs stringForColumn:@"name"];

      NSLog(@"%d,%d,%@",ID,age,name);

    }

    //关闭数据库
    [self.db close];

}

//该FMdatabase线程是不安全的   我们可以使用FMDatabaseQueue来解决线程问题

@property(nonatomic,strong)FMDatabaseQueue * queue;

 //获取沙盒的路径
    NSString * filename=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"student.db"];

    //创建数据库队列实例对象
    self.queue =[FMDatabaseQueue databaseQueueWithPath:filename];

    [self.queue inDatabase:^(FMDatabase *db) {

        //创建数据库表
        BOOL result=  [db executeUpdate:@"create table if not exists t_student(id integer primary key autoincrement ,name text,age integer)"];
        if (result) {

            NSLog(@"创建表成功!");
        }else{

            NSLog(@"创建表失败!");
        }

    }];

由于重复我在写一个修改

[self.queue inDatabase:^(FMDatabase *db) {

        BOOL result =[db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
        if (result) {
            NSLog(@"修改数据成功!");
        }else{

            NSLog(@"修改数据失败!");
        }

    }];

如果我们需要处理多件事情并且要让这多件事情 都完成 或者 都不完成 (只要一件事情没有完成,那么都不会完成)

[self.queue inDatabase:^(FMDatabase *db) {
        //开启事务  如果我们需要处理几件事情并且要让这几件事情都完成或者都不完成 (只要一件事情没有完成,那么都不会完成)
        [db  beginTransaction];
        [db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
        [db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];
        if (如果发现情况不对) {
            //回滚事务
            [db rollback];

             [db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];

        }

        //提交事务
        [db commit];
        [db executeUpdate:@"update t_student set id =? ,age=? where name=?",@1,@23,@"冯倩"];}];
时间: 2024-08-03 20:30:19

iOS 数据存储 FMDB的相关文章

iOS数据存储之SqLite3

iOS中数据存储的方式有很多中,当数据量较大的时候偏好设置,归档和plist就无法满足需求了 这时候就需要用SqLite或者CoreData来存储数据 下面就来介绍一下如何使用SqLite存储数据 要使用Sqlite必须引入libSqlite3.dylib库 要使用首先要有一个handle句柄(handle句柄,在C语言中,通常把用于控制某类东西的叫做句柄,实际上是一个指针.) // 数据库句柄 sqlite3 *_db; SqLite存储数据时也是存在一个文件中的,只不过这个文件格式是定制的,

iOS数据存储的几种方式

iOS的数据存储是iOS应用开发的重要知识点: 关于这方面知识,网上有很多介绍,但对于代码层次的使用方式并未有系统全面介绍.此文章针对iOS稍熟悉的童鞋,需要对CoreData的原理有一定的了解.目前存储方式大概有以下几种: NSKeyedArchiver  适用简单数据加密 NSUserDefaults  适用配置参数 Write  文件操作,同NSKeyedArchiver SQLite3  操作较复杂,不建议使用. CoreData  取代SQLite3,但要遵循NSManagedObje

iOS数据存储之CoreData

iOS中大量数据的储存一个是SqLite,另一个就是CoreData,CoreData允许程序员以面向对象的思维方式的方法去操作面向表的数据库 做过Java开发的对这个应该很熟悉,Java中的Hibernate跟CoreData就很相似 CoreData应该怎样使用呢? 第一步,新建工程后导入CoreData框架 第二部,创建CoreData的数据模型创建步骤如下 然后给你的model起个名字,创建完成后你会看到一个这个文件(相当于数据库文件) 点击这个文件,然后看下图 点击图中1,新建实体(类

IOS数据存储 —— 2 存储方式

IOS数据存储方式 iOS开发常用数据存储方式有:plist.偏好设置 NSUserDefaults.对象归档 NSKeyedArchiver.SQLite3和Core Data 1. plist文件 存储 plist文件通常用于储存用户设置,利用xml属性列表归档NSDictionary.NSArray.NSNumber等类型数据 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用 注意:plist不能存储自定义对象 2. 偏好设置 NSUserDefaults 偏好设置

iOS数据存储类型 及 堆(heap)和栈(stack)

iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收. 3全局区(静态存储区)-- 全局变量和静态变量的存储是放在一块区域 ,程序退出后自动释放 .全局区又分为全局初始化区和全局未初始化区.初始化的全局变量和静态变量存放在全局初始化区,未初始化的全局变量和未初始化的静态变量存放在相邻的另一块区域. 4常量区-- 专门放数字/字符常量的地方, 程

iOS数据存储之属性列表理解

iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起驻留在内存中,一旦程序运行结束从内存中退出后,这些数据也就相应消失了.等到再次运行程序的时候,之前的那些数据又要重新计算.但是对于一些应用,我们需要将程序产生的数据持久的保存起来,使得应用重启之后这些数据不会丢失,这时候就需要用到数据的持久化技术. 在iOS设备上实现数据持久化存储的方式有很多中机制

iOS 数据存储 - 01基本介绍

1.应用沙盒 sandbox 1. 什么是沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 2.应用沙盒结构 应用程序包: 包含了所有的 资源文件和 可执行文件 Documents: 保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录.保存相对重要的数据 tmp: 保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除.应用没有运行时

IOS 数据存储之 FMDB 详解

FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过多的关心数据库操作的知识.但是它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本和维护的成本,就需要使用比较原始的SQLite. Core Data是ORM的一种体现,使用Core Data需要用到模型数据的转化,虽

iOS - 数据存储方式(本地化)

iOS中数据存储方式 一般使用以下4种: 1.NSKeyedAchiever//序列化 存放对象 2.NSUserDefaults//本质是plist存储 NSData.NSString.NSNumber.NSDate.NSArray.NSDictionary //存储到沙盒下的Library/Preferences/ 3.writeToFile:atomically://直接写文件方式:NSString.NSArray.NSDictionary.NSData.NSNumber,存放在一个属性列