IOS数据存储之Sqlite数据库

前言:

之前学习了数据存储的NSUserDefaults,归档和解档,沙盒文件存储,但是对于数据量比较大,需要频繁查询,删除,更新等操作的时候无论从效率上还是性能上,上述三种明显不能满足我们的日常开发需要了。这个时候我们必须借助数据库,做为Android开发的都知道采用的是一种轻量级数据库Sqlite。其实它广泛用于包括浏览器、IOS,Android以及一些便携需求的小型web应用系统。它具备占用资源低,处理速度快等优点。接下来我们具体认识一下。

我们在项目开发中需要引入libsqlite3.dylib,那么sqllite有哪些具体方法呢?

sqlite3  *db, 数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_open(),   打开数据库,没有数据库时创建。
sqlite3_exec(),   执行非查询的sql语句
Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
Sqlite3_close(), 关闭数据库文件还有一系列的函数,用于从记录集字段中获取数据,如
sqlite3_column_text(), 取text类型的数据。
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(), 取int类型的数据

为了系统而且方面的学习sqlite 整理一个sqlite管理类DBManager,实现功能具体涵盖了:数据库的创建,打开,关闭,升级,数据的增删改查,以及事务的开启和开启事务的好处。

DBManager.h

#import <Foundation/Foundation.h>

@interface DBManager : NSObject<NSCopying>

//创建数据库管理者单例
+(instancetype)shareManager;

//打开数据库
-(void)openDb;

//关闭数据库
-(void)closeDb;

//执行sql语句
-(void)execSql:(NSString *)sql;

//创建数据库表
-(void)creatTable;

//删除表结构
-(void)dropTable;

//插入数据
-(void)insertData:(NSString*)tempName;

//插入数据未开启事务
-(void)insertDataByNomarl:(NSArray*)tempNames;

//插入数据开启事务
-(void)insertDataByTransaction:(NSArray*)tempNames;

//删除数据
-(void)deleteData:(NSString*)tempName;

//删除数据
-(void)deleteData;

//修改数据
-(void)updateData:(NSString*)tempName;

//查询数据
-(void)queryData;

@end

DBManager.m

#import "DBManager.h"
#import <sqlite3.h>

#define DBNAME @"myDb" //数据库名字
#define TBNAME @"persons" //表名
#define DBVERSION 1      //数据库版本
#define DBVERSIONKEY @"dbversion_key" //存储数据库版本key

static DBManager *instance=nil;

@implementation DBManager
{
    //创建数据库实例
    sqlite3 *db;
}

-(instancetype)init
{
    self=[super init];
    if (self) {
        [self creatTable];
        [self upgrade];
    }
    return self;
}

//创建数据库管理者单例
+(instancetype)shareManager
{
    if(instance==nil){
        @synchronized(self){
            if(instance==nil){
                instance =[[[self class]alloc]init];
            }
        }
    }
    return instance;
}

-(id)copyWithZone:(NSZone *)zone
{

    return instance;
}

+(id)allocWithZone:(struct _NSZone *)zone
{
    if(instance==nil){
        instance =[super allocWithZone:zone];
    }
    return instance;
}

//打开数据库
-(void)openDb
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documents = [paths objectAtIndex:0];
    NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];

    if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK) {
       NSLog(@"数据库打开成功");
    }else{
        [self closeDb];
        NSLog(@"数据库打开失败");
    }

}

//关闭数据库
-(void)closeDb
{
    sqlite3_close(db);
}

//检查数据库是否需要升级
- (void)upgrade {
    //获取存储好的原版本号
    NSInteger oldVersionNum = [[NSUserDefaults standardUserDefaults] integerForKey:DBVERSIONKEY];
    if (DBVERSION <= oldVersionNum || oldVersionNum == 0) {
        return;
    }

    //升级
    [self upgrade:oldVersionNum];

    // 保存新的版本号到库中 -这里大家可以使用NSUserDefault存储
    [[NSUserDefaults standardUserDefaults]setInteger:DBVERSION forKey:DBVERSIONKEY];
}

//根据不同版本执行不同的升级逻辑
- (void)upgrade:(NSInteger)oldVersion {
    if (oldVersion >= DBVERSION) {
        return;
    }
    switch (oldVersion) {
        case 0:
            //执行相应的升级操作
            break;
        case 1:
             //执行相应的升级操作
            break;
        case 2:
             //执行相应的升级操作
            break;
        default:
            break;
    }
    oldVersion ++;
    // 递归判断是否需要升级
    [self upgrade:oldVersion];
}

//执行sql语句
-(void)execSql:(NSString *)sql
{
    [self openDb];
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
        NSLog(@"数据库操作数据成功!");
    }else{
         sqlite3_free(err);
         NSLog(@"数据库操作数据失败!");
    }
    sqlite3_close(db);
}

//创建数据库表
-(void)creatTable
{
    NSString *creatTableSql=[NSString stringWithFormat:@"create table if not exists %@(person_id integer primary key,name text)",TBNAME];
    [self execSql:creatTableSql];
}

//删除数据库表
-(void)dropTable
{
    NSString *dropTableSql=[NSString stringWithFormat:@"drop table  %@",TBNAME];
    [self execSql:dropTableSql];
}

//插入数据
-(void)insertData:(NSString*)tempName
{
    NSString *insertSql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,tempName];
    [self execSql:insertSql];
}

//插入数据未开启事务
-(void)insertDataByNomarl:(NSArray*)tempNames
{
     [self openDb];
      for(NSString *name in tempNames){
        NSString *sql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,name];
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
            NSLog(@"数据库操作数据成功!");
        }else{
            sqlite3_free(err);
            NSLog(@"数据库操作数据失败!");
        }
    }
    [self closeDb];
}

//插入数据开启事务
-(void)insertDataByTransaction:(NSArray*)tempNames
{
    @try{
        char *errorMsg;
        [self openDb];
        if (sqlite3_exec(db, "BEGIN", NULL, NULL, &errorMsg)==SQLITE_OK) {

            NSLog(@"启动事务成功");

            sqlite3_free(errorMsg);

            //执行真正的操作
            for(NSString *name in tempNames){
                NSString *sql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,name];
                char *err;
                if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
                    NSLog(@"数据库操作数据成功!");
                }else{
                    sqlite3_free(err);
                    NSLog(@"数据库操作数据失败!");
                }
            }

            if (sqlite3_exec(db, "COMMIT", NULL, NULL, &errorMsg)==SQLITE_OK) {

                NSLog(@"提交事务成功");
            }

            sqlite3_free(errorMsg);

        }else{
            sqlite3_free(errorMsg);
        }

    }

    @catch(NSException *e){

        char *errorMsg;
        if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, &errorMsg)==SQLITE_OK) {
            NSLog(@"回滚事务成功");
        }
        sqlite3_free(errorMsg);

    }
    [self closeDb];
}

//删除数据
-(void)deleteData:(NSString*)tempName
{
    NSString *deleteSql=[NSString stringWithFormat:@"delete from %@ where name = ‘%@‘",TBNAME,tempName];
    [self execSql:deleteSql];

}

//删除数据
-(void)deleteData
{
    NSString *deleteSql=[NSString stringWithFormat:@"delete from %@ ",TBNAME];
    [self execSql:deleteSql];
}

//修改数据
-(void)updateData:(NSString*)tempName
{
    NSString *updateSql=[NSString stringWithFormat:@"update %@ set name =‘test‘ where name = ‘%@‘",TBNAME,tempName];
    [self execSql:updateSql];

}

//查询数据
-(void)queryData
{
    [self openDb];
    NSString *querySql =[NSString stringWithFormat:@"select * from %@",TBNAME];
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(db, [querySql UTF8String], -1, &stmt, nil) == SQLITE_OK) {

        while (sqlite3_step(stmt)==SQLITE_ROW) {

            char *name = (char *)sqlite3_column_text(stmt, 1);
            NSString *nameString = [[NSString alloc] initWithUTF8String:name];
            NSLog(@"nameString---->%@",nameString);

        }  

        sqlite3_finalize(stmt);
    }
    [self closeDb];

}
@end

具体使用方法:

#import "DBManager.h"
#import <sqlite3.h>

#define DBNAME @"myDb" //数据库名字
#define TBNAME @"persons" //表名
#define DBVERSION 1      //数据库版本
#define DBVERSIONKEY @"dbversion_key" //存储数据库版本key

static DBManager *shareManager=nil;

@implementation DBManager
{
    //创建数据库实例
    sqlite3 *db;
}

-(instancetype)init
{
    self=[super init];
    if (self) {
        [self creatTable];
        [self upgrade];
    }
    return self;
}

//创建数据库管理者单例
+(instancetype)shareManager
{
    if(shareManager==nil){
        @synchronized(self){
            if(shareManager==nil){
                shareManager =[[[self class]alloc]init];
            }
        }
    }
    return shareManager;
}

-(id)copyWithZone:(NSZone *)zone
{

    return shareManager;
}

+(id)allocWithZone:(struct _NSZone *)zone
{
    if(shareManager==nil){
        shareManager =[super allocWithZone:zone];
    }
    return shareManager;
}

//打开数据库
-(void)openDb
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documents = [paths objectAtIndex:0];
    NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];

    if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK) {
       NSLog(@"数据库打开成功");
    }else{
        [self closeDb];
        NSLog(@"数据库打开失败");
    }

}

//关闭数据库
-(void)closeDb
{
    sqlite3_close(db);
}

//删除数据库
-(void)dropDb
{

}

//检查数据库是否需要升级
- (void)upgrade {
    //获取存储好的原版本号
    NSInteger oldVersionNum = [[NSUserDefaults standardUserDefaults] integerForKey:DBVERSIONKEY];
    if (DBVERSION <= oldVersionNum || oldVersionNum == 0) {
        return;
    }

    //升级
    [self upgrade:oldVersionNum];

    // 保存新的版本号到库中 -这里大家可以使用NSUserDefault存储
    [[NSUserDefaults standardUserDefaults]setInteger:DBVERSION forKey:DBVERSIONKEY];
}

//根据不同版本执行不同的升级逻辑
- (void)upgrade:(NSInteger)oldVersion {
    //对比数据库版本
    if (oldVersion >= DBVERSION) {
        return;
    }
    switch (oldVersion) {
        case 0:
            //执行相应的升级操作
            break;
        case 1:
             //执行相应的升级操作
            break;
        case 2:
             //执行相应的升级操作
            break;
        default:
            break;
    }
    oldVersion ++;
    // 递归判断是否需要升级
    [self upgrade:oldVersion];
}

//执行sql语句
-(void)execSql:(NSString *)sql
{
    [self openDb];
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
        NSLog(@"数据库操作数据成功!");
    }else{
         sqlite3_free(err);
         NSLog(@"数据库操作数据失败!");
    }
    sqlite3_close(db);
}

//创建数据库表
-(void)creatTable
{
    NSString *creatTableSql=[NSString stringWithFormat:@"create table if not exists %@(person_id integer primary key,name text)",TBNAME];
    [self execSql:creatTableSql];
}

//删除数据库表
-(void)dropTable
{
    NSString *dropTableSql=[NSString stringWithFormat:@"drop table  %@",TBNAME];
    [self execSql:dropTableSql];
}

//插入数据
-(void)insertData:(NSString*)tempName
{
    NSString *insertSql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,tempName];
    [self execSql:insertSql];
}

//插入数据未开启事务
-(void)insertDataByNomarl:(NSArray*)tempNames
{
     [self openDb];
      for(NSString *name in tempNames){
        NSString *sql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,name];
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
            //NSLog(@"数据库操作数据成功!");
        }else{
            sqlite3_free(err);
            //NSLog(@"数据库操作数据失败!");
        }
    }
    [self closeDb];
}

//插入数据开启事务
-(void)insertDataByTransaction:(NSArray*)tempNames
{
    @try{
        char *errorMsg;
        [self openDb];
        if (sqlite3_exec(db, "BEGIN", NULL, NULL, &errorMsg)==SQLITE_OK) {

            NSLog(@"启动事务成功");

            sqlite3_free(errorMsg);

            //执行真正的操作
            for(NSString *name in tempNames){
                NSString *sql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,name];
                char *err;
                if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
                    //NSLog(@"数据库操作数据成功!");
                }else{
                    sqlite3_free(err);
                   // NSLog(@"数据库操作数据失败!");
                }
            }

            if (sqlite3_exec(db, "COMMIT", NULL, NULL, &errorMsg)==SQLITE_OK) {

                NSLog(@"提交事务成功");
            }

            sqlite3_free(errorMsg);

        }else{
            sqlite3_free(errorMsg);
        }

    }

    @catch(NSException *e){

        char *errorMsg;
        if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, &errorMsg)==SQLITE_OK) {
            NSLog(@"回滚事务成功");
        }
        sqlite3_free(errorMsg);

    }
    [self closeDb];
}

//删除数据
-(void)deleteData:(NSString*)tempName
{
    NSString *deleteSql=[NSString stringWithFormat:@"delete from %@ where name = ‘%@‘",TBNAME,tempName];
    [self execSql:deleteSql];

}

//删除数据
-(void)deleteData
{
    NSString *deleteSql=[NSString stringWithFormat:@"delete from %@ ",TBNAME];
    [self execSql:deleteSql];
}

//修改数据
-(void)updateData:(NSString*)tempName
{
    NSString *updateSql=[NSString stringWithFormat:@"update %@ set name =‘test‘ where name = ‘%@‘",TBNAME,tempName];
    [self execSql:updateSql];

}

//查询数据
-(void)queryData
{
    [self openDb];
    NSString *querySql =[NSString stringWithFormat:@"select * from %@",TBNAME];
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(db, [querySql UTF8String], -1, &stmt, nil) == SQLITE_OK) {

        while (sqlite3_step(stmt)==SQLITE_ROW) {

            char *name = (char *)sqlite3_column_text(stmt, 1);
            NSString *nameString = [[NSString alloc] initWithUTF8String:name];
            NSLog(@"nameString---->%@",nameString);

        }  

        sqlite3_finalize(stmt);
    }
    [self closeDb];

}

@end

重点来了,曾经做个IM即时通讯方面,聊天信息相对来说还是比较庞大一点,动不动就是成千上万条聊天信息,有时候执行一个消息已读状态的更新都要耗时很长,那时候偶还没有学习IOS开发,在Android平台上我已经领略过开启事务对效率的提升所带来的喜悦了,那么ios上面是怎么开启事务的呢?效率怎么样呢?让我们一探究竟:

开启事务:

//插入数据开启事务
-(void)insertDataByTransaction:(NSArray*)tempNames
{
    @try{
        char *errorMsg;
        [self openDb];
        if (sqlite3_exec(db, "BEGIN", NULL, NULL, &errorMsg)==SQLITE_OK) {

            NSLog(@"启动事务成功");

            sqlite3_free(errorMsg);

            //执行真正的操作
            for(NSString *name in tempNames){
                NSString *sql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,name];
                char *err;
                if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
                    NSLog(@"数据库操作数据成功!");
                }else{
                    sqlite3_free(err);
                    NSLog(@"数据库操作数据失败!");
                }
            }

            if (sqlite3_exec(db, "COMMIT", NULL, NULL, &errorMsg)==SQLITE_OK) {

                NSLog(@"提交事务成功");
            }

            sqlite3_free(errorMsg);

        }else{
            sqlite3_free(errorMsg);
        }
    }

    @catch(NSException *e){

        char *errorMsg;
        if (sqlite3_exec(db, "ROLLBACK", NULL, NULL, &errorMsg)==SQLITE_OK) {
            NSLog(@"回滚事务成功");
        }
        sqlite3_free(errorMsg);
    }
    [self closeDb];
}

同时准备一个未开启事务的:

//插入数据未开启事务
-(void)insertDataByNomarl:(NSArray*)tempNames
{
     [self openDb];
      for(NSString *name in tempNames){
        NSString *sql = [NSString stringWithFormat:@"insert into %@ (name) values (‘%@‘)",TBNAME,name];
        char *err;
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) == SQLITE_OK) {
            NSLog(@"数据库操作数据成功!");
        }else{
            sqlite3_free(err);
            NSLog(@"数据库操作数据失败!");
        }
    }
    [self closeDb];
}

测试程序:

        //测试事务
          NSMutableArray *testArray =[[NSMutableArray alloc]init];
          int testMaxCount =10000;
          for(int i=0;i<testMaxCount;i++){
               NSString *string = [[NSString alloc] initWithFormat:@"%d",i];
              [testArray addObject:string];
          }

          //未开启事务插入
          CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();

          [[DBManager shareManager]insertDataByNomarl:testArray];
          CFAbsoluteTime end=CFAbsoluteTimeGetCurrent();
          NSLog(@"普通插入 time cost: %0.3f", end - start);

          //删除数据
          [[DBManager shareManager]deleteData];

          //开启事务插入
           start = CFAbsoluteTimeGetCurrent();

          [[DBManager shareManager]insertDataByTransaction:testArray];

           end=CFAbsoluteTimeGetCurrent();
          NSLog(@"开启事务插入 time cost: %0.3f", end - start);

          //删除数据
          [[DBManager shareManager]deleteData];

测试结果:测试数据10000条 单位(秒)

开启事务耗时:0.049

未开启事务耗时:5.614

看到上面的执行结果 是不是惊呆了。

关于数据库升级:由于项目业务发展,数据库有可能要考虑到升级,比如数据库新增表或者已有表结构变化,这时候我们就要考虑到数据升级来做版本兼容:

什么时候检查:

-(instancetype)init
{
    self=[super init];
    if (self) {
        [self creatTable];
        [self upgrade];
    }
    return self;
}

怎么实现版本升级:

//检查数据库是否需要升级
- (void)upgrade {
    //获取存储好的原版本号
    NSInteger oldVersionNum = [[NSUserDefaults standardUserDefaults] integerForKey:DBVERSIONKEY];
    if (DBVERSION <= oldVersionNum || oldVersionNum == 0) {
        return;
    }

    //升级
    [self upgrade:oldVersionNum];

    // 保存新的版本号到库中 -这里大家可以使用NSUserDefault存储
    [[NSUserDefaults standardUserDefaults]setInteger:DBVERSION forKey:DBVERSIONKEY];
}

//根据不同版本执行不同的升级逻辑
- (void)upgrade:(NSInteger)oldVersion {
    //对比数据库版本
    if (oldVersion >= DBVERSION) {
        return;
    }
    switch (oldVersion) {
        case 0:
            //执行相应的升级操作
            break;
        case 1:
             //执行相应的升级操作
            break;
        case 2:
             //执行相应的升级操作
            break;
        default:
            break;
    }
    oldVersion ++;
    // 递归判断是否需要升级
    [self upgrade:oldVersion];
}

至此原生的Sqlite基础使用就告一段落了,至于高级使用一般情况涉及到的多数是sql语句的使用,sql语句不善长的小伙伴可以去熟悉一下sql数据!这时就在想了IOS有没有像Android一样的第三方数据库框架呢?也让我等sql小白缓解一下压力?特意查询了一下,以下仅供参考:Sqlitepersistentobjects ,FMDB(这个在两年前使用过)。

时间: 2024-07-29 12:27:20

IOS数据存储之Sqlite数据库的相关文章

Android基础之十四数据存储 之 SQLite数据库详解

Android基础之十四数据存储 之 SQLite数据库详解 SQLite 是一款 轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用. SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID( 原子性(Atomicity) .一致性(Consistency) . 隔离性(Isolation) . 持久性(Durability))事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手 SQLite.而

IOS数据存储之FMDB数据库

前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级的关系型数据库,不过直接用ios sdk提供的API来进行数据库开发,多多少少感觉不那么得心应手.后来也学了更加面向对象的CoreData数据库,不过coreData感觉对数据库的支持不太那么好,虽然操作方便,但是损失了性能以及效率,对于数据量比较大的app来说就有点不太合适了,如果有兴趣的可以看下

IOS 数据存储之 SQLite详解

在IOS开发中经常会需要存储数据,对于比较少量的数据可以采取文件的形式存储,比如使用plist文件.归档等,但是对于大量的数据,就需要使用数据库,在IOS开发中数据库存储可以直接通过SQL访问数据库,也可以通过ORM进行对象关系的映射,当然也可以选择使用第三方框架实现对数据库的操作.在这里,主要来讲解一下第一种方式,SQLite. SQLite 数据库有很多,分为重量级和轻量级两类,移动设备的内存比较小,因此需要选择轻量级的数据库.在移动设备上应用程序开发中使用数据库,比较主流的是SQLite.

Android数据存储引擎---SQLite数据库

目标:是否可以在PC端桌面上使用SQLite数据库制作一个财务文件? 目录: 来源: 实践: 总结和比较: SQLite数据简介 是什么,内部结构是怎样的,数据库和表的关系是什么 有什么用 常用的操作是什么 SQLite数据库使用 增 删 改 查 SQLite数据库实践上的优化措施 对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,使我们轻松完成对数据的存取. 步骤1,熟悉创建数据库表,熟悉相关的操作指令,实现对SQLite数据库的感性认识 创建一个包含简单内容的数

Android数据存储之SQLite 数据库学习

Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库 (3) File文件,通过读取写入方式生成文件存放数据 (4) ContentProvider,主要用于让其他应用程序使用保存的数据 (5)通过网络获取数据和写入数据到网络存储空间 SQLite 数据库介绍 SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占

Android数据存储之SQLite数据库

SQLite是一个小巧的嵌入式数据库,使用方便.开发简单,手机上最早由IOS运用,后来Android也采用了SQLite. SQLite的多数SQL语法与Oracle 一样,下面只列出不同的地方: (1)建表时为避免重复操作,应加上IF NOT EXISTS关键词,例如CREATE TABLE IF NOT EXISTS table_name (2)删表时为避免重复操作,应加上IF EXISTS关键词,例如DROP TABLE IF EXISTS table_name (3)添加新列时使用ALT

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数据存储之SqLite3

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