IOS开发之数据库SQLite3的使用

SQLite,是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式 产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。SQLite,它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多 程序语言相结合,比如 Tcl、C#、PHP、Java等,比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

SQLite第一个Alpha版本诞生于2000年5月,至今已经有10个年 头了, SQLite也迎来了一个版本 SQLite 3已经发布。SQLite 更是一个轻量级别数据库, 具有很多不错的特点。 支持事件不需要配置,不需要安装。iOS中的数据库相对较小,也是关系型数据库,可以对数据库进行增删改查, 机中一般像通讯录,图都可用此数据库存储。

以创建数据库wordbook.db,在该数据库中再创建一个wordbook的表为例

一、终端创建

1.1、创建数据库

打开终端,输入命令在命令行下输入即可打开此数据库(如果该数据库不存在则创建新的数据库)

sqlite3 wordbook.db

1.2、创建表

创建数据库之后,终端开头就变成了sqlite>这种随时输入命令的状态,然后可以创建表,并设定表中相应的结构,前面是表中的属性值和值的属性,其中integer primary key这种属性是代表的数据库的自增长的id索引,text是字符串,double是double数字类型,integer是整数,date是日期

create table wordbook(key integer primary key,item text,price double,groupid integer,dataadd date);

别忘了执行go命令

也可以使用create table if not exists table_name ******;先判断下这个表之前是否已经创建过了,如果没有创建过再创建

create table if not exists wordbook2(key integer primary key,item text,price double,groupid integer,dataadd date)

屏幕快照 2016-11-17 下午11.23.35.png

里面create的结构也可以分开写,只要保持完整即可,比如像下面这样

屏幕快照 2016-11-17 下午11.29.00.png

创建好表之后,就能在对应的文件夹看到该db文件了

二、终端插入数据

插入数据可以执行对应的命令

insert into table_name (columnName, columnName) values (***, ***) ;

屏幕快照 2016-11-17 下午11.36.57.png

索引值是自动增加的,不用设置,直接从item开始设置即可

三、终端删除、查询、等其他终端命令

//删表: 
drop table if exists table_name; 
//插入数据(insert):
insert into table_name (columnName, columnName) values (***, ***) ; 
//查看table_name表中所有记录;
select * from table_name;
//查询符合指定条件的记录; 删除数据
select * from table_name where columnName=‘xxxxx’; 
//删除指定条件的记录;
delete from table_name where columnName='xxxxx’;
//显示所有表名
.tables 
//命令可以查看创建数据对象时的SQL命令
.schema (tableName)

四、代码使用

iOS提供一种机制使每个应用在 自己的沙盒下,沙盒规定了应用程序只能在为该应用创建的文 件夹内读取文件,不能随意去访问别的应用程序沙盒内容。 应用程序所有的非代码文件都应保存在这个 地方,比如图片、声音、属性列表和文本文件等。

每个沙盒含有3个文件夹:Documents, Library 和 tmp和一个应用程序文 件(也是一个文件)。因为应用的沙盒机制,应用只能在几个目录下读写文件

  • Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下 ,iTunes备份和恢复的时候会包括此目录。

  • Library:存储程序的默认设置或其它状态信息; 

  • Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除    

  • tmp:提供一个即时创建临时文件的地方。

 iTunes在与iPhone同步时,备份所有的Documents和Library文件。 iPhone在重启时,会丢弃所有的tmp文件。

所以数据库要存到Documents文件夹下,可以采用以下两个方式获得Documents文件夹

//NSSearchPathForDirectoriesInDomains获得Documents文件夹
NSArray* array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString* path = [array objectAtIndex:0]; 
NSLog(@”path = %@",path); 
//或者自己拼接获得Documents文件夹
self.mydbpath=[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/wordbook.db"];

然后把用终端创建的wordbook.db拖到工程中,使用代码复制到Documents文件夹中即可

-(void)createdb
{
    self.mydbpath=[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/wordbook.db"];
    NSFileManager *manage=[NSFileManager defaultManager];
    if ([manage fileExistsAtPath:self.mydbpath]) {
    }
    else
    {
        NSString *path=[[NSBundle mainBundle]pathForResource:@"wordbook" ofType:@"db"];
        [manage copyItemAtPath:path toPath:self.mydbpath error:nil];
    }
}

工程导入libsqlite3.dylib加入到Xcode项目中去。 并包含头文件 #import <sqlite3.h>

五、代码插入数据

-(void)insertdb
{
    [self createdb];
    const char *filename=[self.mydbpath UTF8String];
    sqlite3 *db;
    int d;
    d = sqlite3_open(filename, &db);
    if (d!=SQLITE_OK) {
    }
    else
    {
        NSString *insertstring=[NSString stringWithFormat:@"insert into wordbook(type,info) values(\"%ld\",\"%@\")",(long)self.myDataModel.m_iType,[self.myDataModel.m_aInfoArray componentsJoinedByString:@","]];
        const char *zsql=[insertstring UTF8String];
        sqlite3_stmt *ppStmt;
        d= sqlite3_prepare_v2(db, zsql, -1,&ppStmt, NULL);
        if (d!=SQLITE_OK) {

        }
        else
        {
            d=sqlite3_step(ppStmt);
            if (d!=SQLITE_DONE) {
               
            }
            else
            {
                sqlite3_finalize(ppStmt);
                sqlite3_close(db);
            }
        }
    }
}

六、代码读取对应数据

-(NSMutableArray*)bianlidbWithType:(NSInteger)type;
{
    [self createdb];
    self.myDataArray = [[NSMutableArray alloc] init];
    const char *filename=[self.mydbpath UTF8String];
    sqlite3 *db;
    int d;
    d = sqlite3_open(filename, &db);
    if (d!=SQLITE_OK) {
       
    }
    else
    {
        NSString *insertstring;
        if (type == DATA_TYPE_ALL) {
             [email protected]"SELECT * FROM wordbook";
        }
        else
        {
            insertstring=[NSString stringWithFormat:@"SELECT * FROM wordbook WHERE type LIKE '%ld'",(long)type];
        }
        const char *zsql=[insertstring UTF8String];
        sqlite3_stmt *ppStmt;
        d= sqlite3_prepare_v2(db, zsql, -1,&ppStmt, NULL);
        if (d!=SQLITE_OK) {
            
        }
        else
        {
        //逐条读取对应的值处理,我这个myDataModel是自己写的类,所以直接复制会报错,根据你的数据读取即可
            while ((d=sqlite3_step(ppStmt))==SQLITE_ROW) {
                Sqpldata *sqpl =[[Sqpldata alloc]init];
                sqpl.myDataModel = [[DataModel alloc] init];
                sqpl.myDataModel.m_aInfoArray = [[NSMutableArray alloc] init];
                int key = sqlite3_column_int(ppStmt, 0);
                int type=sqlite3_column_int(ppStmt, 1);
                const unsigned char*info=sqlite3_column_text(ppStmt, 2);
                sqpl.mykey=key;
                sqpl.myDataModel.m_iType = type;
                
                NSString *str =[NSString stringWithUTF8String:(const char*)info];
                sqpl.myDataModel.m_aInfoArray = [NSMutableArray arrayWithArray:[str componentsSeparatedByString:@","]];
                [self.myDataArray addObject:sqpl];
            }
            sqlite3_finalize(ppStmt);
            sqlite3_close(db);
            }
    }
    return self.myDataArray;
}

七、代码删除指定key值数据

-(void)deletedb:(NSInteger)sqpldataKey;
{
    [self createdb];
    const char *filename=[self.mydbpath UTF8String];
    sqlite3 *db;
    int d;
    d = sqlite3_open(filename, &db);
    if (d!=SQLITE_OK) {
        
    }
    else
    {
        NSString *insertstring=[NSString stringWithFormat:@"DELETE FROM wordbook WHERE key=%ld",(long)sqpldataKey];
        const char *zsql=[insertstring UTF8String];
        sqlite3_stmt *ppStmt;
        d= sqlite3_prepare_v2(db, zsql, -1,&ppStmt, NULL);
        if (d!=SQLITE_OK) {
            
        }
        else
        {
            d=sqlite3_step(ppStmt);
            if (d!=SQLITE_DONE) {
                
            }
            else
            {
                sqlite3_finalize(ppStmt);
                sqlite3_close(db);
            }
        }
    }
}

八、代码更新数据

-(void)updatadb:(NSInteger)sqpldataKey andvalue:(DataModel*)dataModel
{
    [self createdb];
    const char *filename=[self.mydbpath UTF8String];
    sqlite3 *db;
    int d;
    d = sqlite3_open(filename, &db);
    if (d!=SQLITE_OK) {
        
    }
    else
    {
        NSString *insertstring=[NSString stringWithFormat:@"update wordbook set %@=\"%@\" where key=%ld",@"info",[dataModel.m_aInfoArray componentsJoinedByString:@","],(long)sqpldataKey];
        const char *zsql=[insertstring UTF8String];
        sqlite3_stmt *ppStmt;
        d= sqlite3_prepare_v2(db, zsql, -1,&ppStmt, NULL);
        if (d!=SQLITE_OK) {
           
        }
        else
        {
            d=sqlite3_step(ppStmt);
            if (d!=SQLITE_DONE) {
                
            }
            else
            {
                sqlite3_finalize(ppStmt);
                sqlite3_close(db);
            }
        }
    }
}

九、代码删除数据库

这里删除数据库其实就是删除文件

-(void)removeDB
{
    self.mydbpath=[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/wordbook.db"];
    NSFileManager *manage=[NSFileManager defaultManager];
    if ([manage fileExistsAtPath:self.mydbpath]) {
        NSError *error;
        if ([manage removeItemAtPath:self.mydbpath error:&error]) {
            NSString *path=[[NSBundle mainBundle]pathForResource:@"wordbook" ofType:@"db"];
            [manage copyItemAtPath:path toPath:self.mydbpath error:nil];
        }
        else{
            NSLog(@"删除过程出现错误");
        }
    }
    else
    {
        NSString *path=[[NSBundle mainBundle]pathForResource:@"wordbook" ofType:@"db"];
        [manage copyItemAtPath:path toPath:self.mydbpath error:nil];
    }
}

十、总结

数据库存储数据肯定比文本储存强,这个我也是偶尔用下,今天刚好用到了就记录下,记得mac终端创建sqlite3数据库命令的时候,别忘了最后go运行下,不然不生效的,代码里面用的model是我自己的数据处理,你要改成你自己的数据处理才可以,比如输出数据或者保存数据等。

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment