数据库

作者: 武一顶顶 | 来源:发表于2017-02-27 08:45 被阅读15次
    • SQLite3 :
    • FMDB
      • 我自己用 Navicat Premium
    Navicat Premium 数据库应用图标.png

    - 版本v11.1.5 /'nævɪsɜːt/ /'priːmɪəm/

    • (李游下数据库)datagrip-2017.1.5
    15.数据库的操作
    
    增删改查操作,FMDB
    
    创建表:creat table 表名(字段名1 字段类型1,字段名2 字段类型2);
    
    删除表:drop table 表名;
    
    增:insert into 表名(字段1,字段2) values(字段1的值,字段2的值);
    
    删:delete from 表名;
    
    改:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值;
    
    select 字段1,字段2 from 表名;
    
    select 字段1, 字段2, … from 表名1, 表名2  where 表名1.id = 表名2.id;
    
    - 2.4 Core Data:太重量级,不建议用
    - 2.5  FMDB:iOS平台SQLite数据库框架,以OC的方式包装的,灵活,比苹果自带的Core Data框架,更加轻量级和灵活;提供了很多线程安全的数据库操作方法,有效的防止数据混乱
    
    • FMDB 3个类:
      • FMDatabase: 一个FMDatabase对象就代表一个单独的SQLite数据库, 用来执行SQLite语句
      • FMResultSet:使用FMDatabase执行查询后的结果集
      • FMDatabaseQueue:用于在多线程中执行多个查询或更新,他是线程安全的
    8194034E-7125-4BC7-B6E9-F8CF4FC38637.png

    //增删改 都是executeUpdate方法 /'eksɪkjuːt/ 执行
    //查 是executeQuery方法 /'eksɪkjuːt/

    D81A2D01-5949-47FD-883A-C3FF00E9D45F.png

    //FMDateBase不建议使用,用FMDatabaseQueue 线程安全的

    A3ADC550-2AEA-4BD2-BACC-BDE6795D755A.png 699C0922-081E-4E99-ADFD-A19CACE4C8A1.png 51A5904C-8CF0-4DAE-9431-DE49E578C59D.png 8C633B8E-26BB-44B4-8299-93571E070754.png

    //事务
    //方式1


    84EA9342-9F40-4308-8A85-D0F24EAF64B9.png

    //事务
    //或者 用block方式2

    EEAB2C4B-E50D-4A2E-877D-BA2F3C1C68BE.png
    • 遇到的问题bug
      • bug: 创建表时, 如果代码里改变表字段值, 必须卸载app在运行才行, 要不不好重新创建表
      • fmdb DB Error:1 "no such column" 如果你的SQL语句没有错的话, 那你就去检查各个地方 用到逗号或者单引号是不是中文输入的,大部分情况是这个导致的, SQL需要细心啊
    //示例
    #import "DBUtil.h"
    #import <FMDB/FMDB.h>
    
    @interface DBUtil ()
    
    @property (nonatomic,strong) FMDatabase *fmdb;
    
    @end
    
    @implementation DBUtil
    
    static DBUtil *theData = nil;
    
    +(instancetype)sharedDataBase
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            theData= [[DBUtil alloc] init];
            [theData initDataBase];
        });
        
        return theData;
        
    }
    
    -(void)initDataBase
    {
        //获得Documents目录路径
        NSLog(@"沙河路径:%@",NSHomeDirectory());
        
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        
        //文件路径
        
        NSString *filePath = [documentPath stringByAppendingPathComponent:@"position.db"];
        
        //实例化FMDataBase对象
        NSLog(@"---path:%@",filePath);
        
        self.fmdb= [FMDatabase databaseWithPath:filePath];
        
        if([self.fmdb open]) {
            
            //初始化数据表
            [self addPositionTable];
            
            [self.fmdb close];
            
        }else{
            
            NSLog(@"数据库打开失败---%@", self.fmdb.lastErrorMessage);
            
        }
    }
    
    -(void)addPositionTable
    {
        NSString*positionSQL =@"create table if not exists positionCondition (sceneId text primary key, value text ,name text, time text)";
        
        BOOL positionSuccess = [self.fmdb executeUpdate:positionSQL];
        
        if(!positionSuccess) {
            
            NSLog(@"positionCondition 表创建失败---%@",self.fmdb.lastErrorMessage);
            
        } else {
            NSLog(@"positionCondition 表创建成功");
        }
    }
    
    //保存插入的位置条件
    - (void)insertPositionWithSceneId:(NSString *)sceneId position:(NSString *)position
    {
    
        if([self.fmdb open]){
            
            //把以前同名的添加位置条件给删除
            NSString *deleteSQL = @"delete from positionCondition where sceneId = ?";
            [self.fmdb executeUpdate:deleteSQL withArgumentsInArray:@[sceneId]];
            
            //获取当前时间
            NSDate *date = [NSDate date];
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateStyle:NSDateFormatterMediumStyle];
            [formatter setTimeStyle:NSDateFormatterShortStyle];
            [formatter setDateFormat:@"YYYY-MM-dd hh:mm:ss"];
            NSString *dateTime = [formatter stringFromDate:date];
            
            //3.插入数据
            NSString *insertSQL = @"insert into positionCondition (sceneId,value,name,time) values(?,?,?,?)";
            BOOL success = [self.fmdb executeUpdate:insertSQL withArgumentsInArray:@[sceneId, position, @"", dateTime]];
            NSLog(@"插入数据的结果 - %@",(success ? @"成功" : @"失败"));
        }
       
        //数据库
        [self.fmdb close];
    }
    
    //删除表positionCondition
    - (void)deletePositionCondition
    {
        if(![self.fmdb open]) return;
        
        BOOL isDelete = [self.fmdb executeUpdate:@"DELETE FROM positionCondition;"];
        NSLog(@"删除表 - %@" , (isDelete ? @"成功" : @"失败"));
        [self.fmdb close];
    }
    
    - (NSMutableArray *)positionConditionArray
    {
        if(![self.fmdb open]) return nil;
        
        //1.执行查询的sql语句
        NSString *sql = @"select * from positionCondition";
        FMResultSet *result = [self.fmdb executeQuery:sql];
        
        NSMutableArray *arrM = [NSMutableArray array];
        
        //2.遍历结果
        while(result.next){
            //3.封装成模型添加到数组
            NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:0];
            [dic setObject:[result stringForColumn:@"sceneId"] forKey:@"sceneId"];
            [dic setObject:[result stringForColumn:@"value"] forKey:@"value"];
            [arrM addObject:dic];
        }
    
        [self.fmdb close];
    
        return [arrM copy];
    
    }
    
    //bug: 创建表时, 如果代码里改变表字段值, 必须卸载app在运行才行, 要不不好重新创建表
    NSString*positionSQL =@"create table if not exists positionCondition (sceneId text primary key, value text ,name text, time text)";
    
    //更新sceneId相应的outside
    - (void)updateOutside:(BOOL)outside sceneId:(NSString *)sceneId
    {
        [self.fmdb open];
        
    //    NSString *outsideString = [NSString stringWithFormat:@"%zd",outside];
       
        NSString *updateSql = [[NSString alloc] initWithFormat:@"update positionCondition set outside = %zd where sceneId = '%@'", outside, sceneId];
        
        BOOL res = [self.fmdb executeUpdate:updateSql];
        
        if (!res) {
            NSLog(@"updateOutside error:%@",self.fmdb.lastError);
        } else {
            NSLog(@"success to updateOutside");
        }
        
        [self.fmdb close];
    }
    

    相关文章

      网友评论

          本文标题:数据库

          本文链接:https://www.haomeiwen.com/subject/rzbdjttx.html