iOS SQLite3的使用

1.创建可修改的数据库文件

//应用包内的内容是不可写的,所以需要把应用包内的数据库拷贝一个副本到资源路径去
- (void)createEditableDatabase{

    BOOL success;
    NSFileManager *manager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [paths objectAtIndex:0];
    NSString *writableDB = [documentDir stringByAppendingPathComponent:@"catalog.db"];

    success = [manager fileExistsAtPath:writableDB];

    if (success) {
        NSLog(@"已经存在");
        return;
    }

    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"catalog.db"];
    success = [manager copyItemAtPath:defaultPath toPath:writableDB error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file:‘%@‘.", [error localizedDescription]);
    }else NSLog(@"成功写入");
}

2.初始化数据库

- (void)initDatabase{

    NSString *path = [[NSBundle mainBundle] pathForResource:@"catalog" ofType:@"db"];
    //NSLog(@"bundle = %@\npath = %@",[NSBundle mainBundle],path);
    if (sqlite3_open([path UTF8String],&database) == SQLITE_OK) {
        NSLog(@"Opening Database");
    }else{
        sqlite3_close(database);
        NSAssert1(0, @"Failed to open database:‘%s‘.", sqlite3_errmsg(database));
    }
}

3.查询

//execute sql statement
- (NSMutableArray *)getAllProducts{

    NSMutableArray *products = [NSMutableArray new];
    //    const char *sql = "SELECT product.ID,product.Name,Manufacturer.name,product.details,product.price,product.quantityonhand,country.country,product.image FROM Product,Manufacturer,Country WHERE manufacturer.manufacturerID = product.manufacturerID and product.countryoforiginID = ?";
    //配合sqlite3_bind_int(stmt,1,2)可使用参数化sql语句查询

    const char *sql = "SELECT product.ID,product.Name,Manufacturer.name,product.details,product.price,product.quantityonhand,country.country,product.image FROM Product,Manufacturer,Country WHERE manufacturer.manufacturerID = product.manufacturerID and product.countryoforiginID = country.countryID";

    NSLog(@"\nsql = %s",sql);

    sqlite3_stmt *stmt;
    int sqlResult = sqlite3_prepare_v2(database,sql,-1,&stmt,NULL);
    //sqlite3_bind_int(stmt,1,2);//sql语句参数查询,语句、参数索引、参数值

    if (sqlResult == SQLITE_OK) {
        NSLog(@"Ready to print sth");
        int time = 0;
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            Product *product = [Product new];
            char *name = (char*)sqlite3_column_text(stmt,1);
            char *manufacturer = (char*)sqlite3_column_text(stmt,2);
            char *details = (char*)sqlite3_column_text(stmt, 3);
            char *countryOfOrigin = (char*)sqlite3_column_text(stmt, 6);
            char *image = (char*)sqlite3_column_text(stmt, 7);

            NSLog(@"%d,name = %s \n",time++,name);

            product.ID = sqlite3_column_int(stmt,0);
            product.name = (name)?[NSString stringWithUTF8String:name]:@"";
            product.manufacturer = (manufacturer)?[NSString stringWithUTF8String:manufacturer]:@"";
            product.details = (details)?[NSString stringWithUTF8String:details]:@"";
            product.price = sqlite3_column_double(stmt,4);
            product.quantity = sqlite3_column_int(stmt,5);
            product.countryOfOrigin = (countryOfOrigin)?[NSString stringWithUTF8String:countryOfOrigin]:@"";
            product.image = (image)?[NSString stringWithUTF8String:image]:@"";

            [products addObject:product];
        }

        sqlite3_finalize(stmt);
    }else{
        NSLog(@"read failed:%d",sqlResult);
    }

    return products;
}

4.关闭数据库

- (void)closeDatabase{
    if (sqlite3_close(database) != SQLITE_OK) {
        NSAssert1(0, @"Error:failed to close database:‘%s‘.", sqlite3_errmsg(database));
    }
}
时间: 2024-08-14 10:24:35

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

简介 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.L

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篇&(五)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不存在,则创建它,否则打开它.如果