iOS sqlite3

简介

sqlite是短小精悍的关系型数据库,常运用于嵌入式设备,麻雀虽小五脏俱全,能满足大部分数据存储的需求,目前使用最多的是sqlite3。

其语句不区分大小写,每条语句必须以分号(;)结尾 ,不可使用关键字对表和字段命名。

常用关键字有SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、TABLE、FROM、WHERE、SET、ORDER、BY、GROUP、HAVING、DESC、ASC、VIEW、INDEX、IF NOT EXISTS、LIMIT、LIKE,JOIN、LEFT JOIN、ON等等

虽然sqlite是不区分存储类型,甚至建表时都可以不设置类型,默认存储为字符串,但大致分为:

INTEGER(整型): int

REAL(浮点型): float, double

TEXT(字符串):char

BLOD(二进制数据)

sqlite常用约束条件有:

PRIMARY KEY (主键)

NOT NULL (非空)

UNIQUE (不重复)

FOREIGN KEY (外键)

CHECK (满足指定条件)

DEFAULT (给定默认值)

AUTOINCREMENT (字段为整型可自动加1)

SQL语句基本示例

create table if not exists test (id int primary key autoincrement name text, age integer default 1, address text not null);

crate table T2 as select id, name, age, address from T1 where 1=1;

drop table if exists test;

insert into test (name, age,address) values (‘jack‘,30,‘china‘);

update test set name = ‘LiMing‘, age = 32 where address = ‘china‘;

delete from test where name = ‘jack‘;

select * from test where name = ‘LiMing‘;

select * from test where name like ‘Li%‘;

select count(*) from test where name like ‘%M%‘;

select max(age) from test;

select min(age) from test;

select avg(age) from test;

select sum(age) from test;

select s.name, s.age, b.name as bookname, b.price from student s join book b on b.id = s.bookid;

iOS代码示例

#import <Foundation/Foundation.h>

@interface SQLiteManager : NSObject

+(instancetype)shareInstance;

-(NSError*)openDBWithName:(NSString*)name;

-(NSError*)openDBWithPath:(NSString*)path;

-(NSError*)updateWithSQL:(NSString*)sql;

-(NSArray*)queryWithSQL:(NSString*)sql;

@end
#import "SQLiteManager.h"
#import <sqlite3.h>

static SQLiteManager *instance;

@interface SQLiteManager ()

@property (nonatomic) sqlite3 *db;

@end

@implementation SQLiteManager

+(instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t token;
    dispatch_once(&token, ^{
        if (!instance) {
            instance = [self allocWithZone:zone];
        }
    });

    return instance;
}

+(instancetype)shareInstance {
    static dispatch_once_t token;
    dispatch_once(&token, ^{
        if (!instance) {
            instance = [[SQLiteManager alloc] init];
        }
    });
    return instance;
}

-(NSError*)openDBWithName:(NSString*)name {

    NSString *directory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    NSString *path = [directory stringByAppendingPathComponent:name];

    return [self openDBWithPath:path];
}

-(NSError*)openDBWithPath:(NSString*)path {

    if (SQLITE_OK != sqlite3_open([path UTF8String], &_db)) {

        sqlite3_close(_db);

        return [NSError errorWithDomain:[NSString stringWithFormat:@"打开数据库失败:%@",path] code:-1 userInfo:nil];

    }

    return nil;
}

-(NSError*)updateWithSQL:(NSString*)sql {
    char *error;

    if (SQLITE_OK != sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &error)) {

        return [NSError errorWithDomain:[NSString stringWithFormat:@"执行SQL语句失败:%@",sql] code:-1 userInfo:nil];

    }

    return nil;
}

-(NSArray*)queryWithSQL:(NSString*)sql {
    NSMutableArray *results = [[NSMutableArray alloc] init];

    sqlite3_stmt *stmt;

    if (SQLITE_OK == sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL)) {

        while (SQLITE_ROW == sqlite3_step(stmt)) {

            int count = sqlite3_column_count(stmt);

            NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];

            for (int i=0; i<count; i++) {

                NSString *key = [NSString stringWithUTF8String:sqlite3_column_name(stmt, i)];

                NSString *value = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, i)];

                [dic setValue:value forKey:key];

            }

            [results addObject:dic];

        }

    }

    sqlite3_finalize(stmt);

    return nil;
}

-(NSError*)insertData:(NSData*)data key:(NSString*)key{
    //create table if not exsts datatable (key text, data blod);
    NSString *sql = @"insert into datatable(key, data) values(?,?)";

    sqlite3_stmt *stmt;

    NSError *error = [NSError errorWithDomain:[NSString stringWithFormat:@"执行SQL语句失败:%@",sql] code:-1 userInfo:nil];

    if (SQLITE_OK != sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL)) {
        return error;
    }

    sqlite3_bind_text(stmt, 1, [key UTF8String], -1, NULL);

    sqlite3_bind_blob(stmt, 2, data.bytes, (int)data.length, NULL);

    if (sqlite3_step(stmt) != SQLITE_DONE) {
        return error;
    }

    sqlite3_finalize(stmt);

    return nil;
}

-(NSError*)updateData:(NSData*)data key:(NSString*)key{
    //create table if not exsts datatable (key text, data blod);
    NSString *sql = [NSString stringWithFormat:@"update datatable set data = ? where key = %@",key];

    sqlite3_stmt *stmt;

    NSError *error = [NSError errorWithDomain:[NSString stringWithFormat:@"执行SQL语句失败:%@",sql] code:-1 userInfo:nil];

    if (SQLITE_OK != sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL)) {
        return error;
    }

    sqlite3_bind_text(stmt, 1, [key UTF8String], -1, NULL);

    sqlite3_bind_blob(stmt, 2, data.bytes, (int)data.length, NULL);

    if (sqlite3_step(stmt) != SQLITE_DONE) {
        return error;
    }

    sqlite3_finalize(stmt);

    return nil;
}

-(NSArray*)queryDataWithSQL:(NSString*)sql {
    NSMutableArray *array = [NSMutableArray array];

    sqlite3_stmt *stmt;

    if (SQLITE_OK == sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL)) {

        while (sqlite3_step(stmt) == SQLITE_ROW) {

            NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];

            const void *blod = sqlite3_column_blob(stmt, 1);

            int length = sqlite3_column_bytes(stmt, 1);

            NSData *data = [[NSData alloc] initWithBytes:blod length:length];

            [dic setValue:data forKey:[[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(stmt, 0)]];

            [array addObject:dic];
        }

    }

    return array;
}
时间: 2024-10-20 08:15:19

iOS sqlite3的相关文章

ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防

在数据库创建时应判断数据是否存在(不为空nil) if(sqlite==nil){// 判断数据库是否存在,若存在就不创建,若不存在才创建,以防数据库锁死 if (SQLITE_OK == sqlite3_open(dpPath.UTF8String , &sqlite)) { NSLog(@"数据库创建成功"); }else{ NSLog(@"数据库创建失败"); } } #import "SqlManager.h" #import &

iOS SQLite3数据库操作

iOS中数据持久化分为四种:属性列表.对象归档.SQLite3和Core Data,SQLite3数据库操作是一个必不或缺的技术. SQLite3简介 SQLite3数据库是移动端(iOS.Android.嵌入式)上认定的关系型数据库,与MySQL.Oracle等数据库相比,具有轻量级的优势,这就造成了体积小.迅速.简单功能依旧强大等优势. SQLite3语句特点 不区分大小写 每一句以:结尾 SQLite字段类型 integer:整型 real:浮点值 text:文本字符串 blob:二进制类

iOS sqlite3数据库解析

看来从版本3.3.1基本上已经支持线程句柄的传递功能.具体限制我标记了一下.(6) Is SQLite threadsafe?SQLite is threadsafe. We make this concession since many users choose to ignore the advice given in the previous paragraph. But in order to be thread-safe, SQLite must be compiled with th

iOS SQLite3的使用

1.创建可修改的数据库文件 //应用包内的内容是不可写的,所以需要把应用包内的数据库拷贝一个副本到资源路径去 - (void)createEditableDatabase{ BOOL success; NSFileManager *manager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NS

iOS sqlite3外键级联删除问题解决

最近学习使用数据库,以前上学的时候也学过外键和级联删除. NSString *sql=@"CREATE TABLE PlanModel (Id integer,name text,constraint plan_key primary key (Id))"; NSString *sql=@"CREATE TABLE SystemModel (Id integer,planId integer,name text,foreign key (planId) references

iOS sqlite3保存数组NSArray

四个注意点: 1.创建表时,声明字段类型为二进制 blob NSString *INEditorTableName = @"create table In_Editor(picUrls blob not null)"; 2.插入sql语句,把NSArray转换为NSData类型 NSData *dataImageUrls = [NSKeyedArchiver archivedDataWithRootObject:model.imageUrls]; 3.不能用 [NSString str

iOS开发——数据持久化OC篇&amp;(五)SQLite3详解

SQLite3详解 SQLite是嵌入式的和轻量级的SQL数据库.SQLite是由C实现的.广泛用于包括浏览器(支持HTML5的大部分浏览器,IE除外).iOS.Android以及一些便携需求的小型web应用系统. 1 使用原因:存储.检索信息 2 SQLite是MySQL精简版.但无需服务器就能进行. 3 两个限制:1)必须手动创建数据库 2)没有面向对象的接口. 4 如何手动创建数据库. 使用SQLite前的准备 使用SQLite是很多做iOS开发中第一次面对C的情况,包括我.因为SQLit

iOS数据持久化-OC

沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行. 通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容

【转】iOS开发24:使用SQLite3存储和读取数据

转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加到内存中. 基本操作: (1)打开或者创建数据库 sqlite3 *database; int result = sqlite3_open("/path/databaseFile", &database); 如果/path/databaseFile不存在,则创建它,否则打开它.如果