iOS开发FMDB

本文介绍了iOS开发中使用的SQLite数据库框架FMDB,它为Objective-C开发者提供了面向对象的接口,简化了SQLite操作。FMDB包括FMDatabase、FMResultSet和FMDatabaseQueue三个核心类,支持多线程安全的数据库操作。文章通过实例代码详细讲解了如何导入库文件、创建数据库路径、创建数据库、创建列表以及进行增删改查操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

FMDB是iOS平台的SQLite数据库框架,用OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了冗余的C语言代码,比苹果自家的CoreData框架更加灵活,提供了多线程安全的数据库操作方法,防止才出现数据混乱现象。

FMDB有三个核心类:FMDatabase(用来执行SQL语句,一个FMDBDatabase对象代表一个单独的SQLite数据库);FMResultSet(执行查询后的结果集);FMDatabaseQueue(多线程中执行多个查询或更新)。

二、示例代码

(1)首先导入libsqlite3.tbd库文件并且在github上(https://github.com/ccgus/fmdb)下载FMDB框架导入工程



(2)创建数据库路径

文件路径有三种情况:1.具体文件路径(如果不存在会自动创建);

                                    2.传入的参数是空字符串@“”,会在临时目录下创建这个数据库,当FMDB断开连接的时候会删除这个数据库文件。

                                    3.传入的参数是NULL,会创建一个在内存中的数据库,断开连接时数据库文件被删除。


//获取Document路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    //在此路径下新建一个文件
    NSString *fliepath = [doc stringByAppendingPathComponent:@"student.sqlite"];

(3)创建数据库

//创建一个数据库
    FMDatabase *database = [FMDatabase databaseWithPath:fliepath
                            ];

(4)创建列表

 //创建列表
    if ([database open]) {
        
        BOOL result = [database executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
        if (result ) {
            NSLog(@"列表创建成功");
        }else{
            NSLog(@"列表创建失败");
        }
        
    }

(5)对列表进行增删改查操作


增:

#pragma mark -- 增 (插入数据)
-(void)insert{
    if ([self.database open]) {
        for (int i = 0; i < 5 ; i ++) {
            NSString *name = [NSString stringWithFormat:@"xiao-%d",i];
            [self.database executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name,@(arc4random()%40)];
        }
        //关闭数据库
        [self.database close];
    }

}

删一个:

#pragma mark -- 删除某一条数据
-(void)deleteOne{
    
    if ([self.database open]) {
        NSString *deleteOneSQL = [NSString stringWithFormat:@"delete from t_student where name = '%@'",@"xiao-0"];
        [self.database executeUpdate:deleteOneSQL];
        
        
        [self.database close];
    }
}

全部删除:
#pragma mark -- 删除所有的数据
-(void)deleteAll{
    
    if ([self.database open]) {
        [self.database executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
        [self.database close];
    }
    
}

改数据:

#pragma mark -- 修改数据
-(void)change{
    
    if ([self.database open]) {
        NSString *changeSQL = [NSString stringWithFormat:@"UPDATE t_student SET name = '%@' WHERE id = '%d'",@"xiao-9",2];
        [self.database executeUpdate:changeSQL];
        [self.database close];
    }
    
}

查询:

#pragma mark -- 查询
-(void)search{
    
    if ([self.database open]) {
        FMResultSet *result  = [self.database executeQuery:@"SELECT *FROM t_student"];
        while ([result next]) {
            int ID  = [result intForColumn:@"id"];
            NSString *name = [result stringForColumn:@"name"];
            int age  = [result intForColumn:@"age" ];
            NSLog(@"id = %d ,name = %@ ,age = %d",ID,name,age);
        }
        
        [self.database close];
    }
    
}



Appdelegate.m中

#import "AppDelegate.h"
#import "FMDB.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //获取Document路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    //在此路径下新建一个文件
    NSString *fliepath = [doc stringByAppendingPathComponent:@"student.sqlite"];
    //创建一个数据库
    _database = [FMDatabase databaseWithPath:fliepath];
    //创建列表
    
    if ([_database open]) {
        
        BOOL result = [_database executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
        if (result ) {
            NSLog(@"列表创建成功");
        }else{
            NSLog(@"列表创建失败");
        }
        
    }

    
    // Override point for customization after application launch.
    return YES;
}

viewController.m中

#import "ViewController.h"
#import "FMDB.h"

@interface ViewController ()
@property(nonatomic,strong)FMDatabase *database;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   

           
    self.database = [FMDatabase databaseWithPath:[self getPath]];
       
    if (![self.database open]) {
        return;
    }
    NSString *existsSql = [NSString stringWithFormat:@"select count(name) as countNum from sqlite_master where type = 'table' and name = '%@'",@"t_student"];
    FMResultSet *resultSet = [self.database executeQuery:existsSql];
    if ([resultSet next]) {
        NSInteger count = [resultSet intForColumn:@"countNum"];
        NSLog(@"count = %ld",count);
        if (count == 1) {
            //增
          [self insert];
            //  [self deleteAll];
            //查
            [self search];
            
          
        }
    }
    
    
   // [self deleteAll];
//    //增
//    [self insert];
// //删一个
//    [self deleteOne];
//    //改
//    [self change];
//    
//    //查
//    [self search];
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark -- 增 (插入数据)
-(void)insert{
  
 
    
    

        for (int i = 0; i < 1 ; i ++) {
            NSString *name = [NSString stringWithFormat:@"xiao-%d",i];
            [self.database executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name,@(arc4random()%40)];
        }

   

}

#pragma mark -- 删除某一条数据
-(void)deleteOne{
    

        NSString *deleteOneSQL = [NSString stringWithFormat:@"delete from t_student where name = '%@'",@"xiao-0"];
        [self.database executeUpdate:deleteOneSQL];
        
        
        [self.database close];
   
}


#pragma mark -- 删除所有的数据
-(void)deleteAll{
    

        [self.database executeUpdate:@"DROP TABLE IF EXISTS t_student;"];

  
    
}

#pragma mark -- 修改数据
-(void)change{
    

        NSString *changeSQL = [NSString stringWithFormat:@"UPDATE t_student SET name = '%@' WHERE id = '%d'",@"xiao-9",2];
        [self.database executeUpdate:changeSQL];

    
}

#pragma mark -- 查询
-(void)search{
    

        FMResultSet *result  = [self.database executeQuery:@"SELECT *FROM t_student"];
        while ([result next]) {
            int ID  = [result intForColumn:@"id"];
            NSString *name = [result stringForColumn:@"name"];
            int age  = [result intForColumn:@"age" ];
            NSLog(@"id = %d ,name = %@ ,age = %d",ID,name,age);
        
        
   
    }
    
}

#pragma mark -- 获取路径的方法
-(NSString *)getPath{
      //获取Document路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    //在此路径下拼接新建一个文件
    NSString *fliepath = [doc stringByAppendingPathComponent:@"student.sqlite"];

    return fliepath;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值