iphone开发-SQLite数据库使用

本文详细介绍了如何在iOS应用中使用SQLite3数据库进行基本操作,包括打开数据库、创建表、插入记录及查询数据。通过实例演示,帮助开发者轻松掌握SQLite3在iOS平台的应用。

转载自:http://wiki.eoe.cn/page/iOS_blog_page_14738.html

我现在要使用SQLite3.0创建一个数据库,然后在数据库中创建一个表格。

首先要引入SQLite3.0的lib库。然后包含头文件#import

【1】 打开数据库,如果没有,那么创建一个

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
sqlite3* database_;

-(BOOL) open{ 
        NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *path = [documentsDirectory
stringByAppendingPathComponent:@"mydb.sql"]; 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     BOOL find = [fileManager fileExistsAtPath:path];

    //找到数据库文件mydb.sql 
     if (find) { 
         NSLog(@"Database file have already existed."); 
         if(sqlite3_open([path UTF8String], &database_) != SQLITE_OK)
{ 
             sqlite3_close(database_); 
             NSLog(@"Error: open database file."); 
             return NO; 
         } 
         return YES; 
     } 
     if(sqlite3_open([path UTF8String], &database_) == SQLITE_OK) { 
         bFirstCreate_ = YES; 
         [self  createChannelsTable:database_];//在后面实现函数
createChannelsTable

        return YES; 
     } else { 
         sqlite3_close(database_); 
         NSLog(@"Error: open database file."); 
         return NO; 
     } 
     return NO; 
 }

【2】创建表格

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//创建表格,假设有五个字段,(idcidtitleimageDataimageLen//说明一下,id为表格的主键,必须有。

//cid,和title都是字符串,imageData是二进制数据,imageLen
是该二进制数据的长度。 
 - (BOOL) createChannelsTable:(sqlite3*)db{ 
     char *sql = "CREATE TABLE channels (id integer primary key,  
                                         cid text,  
                                         title text,  
                                         imageData BLOB,  
                                         imageLen integer)"; 
     sqlite3_stmt *statement; 
     if(sqlite3_prepare_v2(db, sql, -1, &statement, nil) !=
SQLITE_OK) { 
         NSLog(@"Error: failed to prepare statement:create channels
table"); 
         return NO; 
     } 
     int success = sqlite3_step(statement); 
     sqlite3_finalize(statement); 
     if ( success != SQLITE_DONE) { 
         NSLog(@"Error: failed to dehydrate:CREATE TABLE channels"); 
         return NO; 
     } 
     NSLog(@"Create table 'channels' successed."); 
     return YES; 
 }

 

【3】 向表格中插入一条记录

假设channle是一个数据结构体,保存了一条记录的内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
- (BOOL) insertOneChannel:(Channel*)channel{ 
     NSData* ImageData = UIImagePNGRepresentation( channel.image_); 
     NSInteger Imagelen = [ImageData length]; 
     sqlite3_stmt *statement; 
     static char *sql = "INSERT INTO channels
(cid,title,imageData,imageLen) 
                         VALUES(?,?,?,?)";

   
//问号的个数要和(cid,title,imageData,imageLen)里面字段的个数匹配,代表未知的值,将在下面将值和字段关联。

     int success = sqlite3_prepare_v2(database_, sql, -1, &statement,
NULL); 
     if (success != SQLITE_OK) { 
         NSLog(@"Error: failed to insert:channels"); 
         return NO; 
     } 
    

   //这里的数字1,2,3,4代表第几个问号 
     sqlite3_bind_text(statement, 1, [channel.id_ UTF8String], -1,
SQLITE_TRANSIENT); 
     sqlite3_bind_text(statement, 2, [channel.title_ UTF8String], -1,
SQLITE_TRANSIENT); 
     sqlite3_bind_blob(statement, 3, [ImageData bytes], Imagelen,
SQLITE_TRANSIENT); 
     sqlite3_bind_int(statement, 4, Imagelen);    


     success = sqlite3_step(statement); 
     sqlite3_finalize(statement); 
      
     if (success == SQLITE_ERROR) { 
         NSLog(@"Error: failed to insert into the database with
message."); 
         return NO; 
     }  
   
   NSLog(@"Insert One Channel#############:id = 
[%@",channel.id](mailto:%@%22,channel.id)_); 
     return YES; 
 }

 

【4】数据库查询

这里获取表格中所有的记录,放到数组fChannels中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- (void) getChannels:(NSMutableArray*)fChannels{ 
     sqlite3_stmt *statement = nil; 
     char *sql = "SELECT * FROM channels"; 
     if (sqlite3_prepare_v2(database_, sql, -1, &statement, NULL) !=
SQLITE_OK) { 
         NSLog(@"Error: failed to prepare statement with message:get
channels."); 
     } 
     //查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值。 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
         char* cid       = (char*)sqlite3_column_text(statement, 1);

         char* title     = (char*)sqlite3_column_text(statement, 2);

         Byte* imageData = (Byte*)sqlite3_column_blob(statement, 3);

         int imageLen    = sqlite3_column_int(statement, 4);         
         Channel* channel = [[Channel alloc] init]; 
         if(cid) 
             channel.id_ = [NSString stringWithUTF8String:cid]; 
         if(title) 
             channel.title_ = [NSString stringWithUTF8String:title]; 
         if(imageData){ 
             UIImage* image = [UIImage imageWithData:[NSData
dataWithBytes:imageData length:imageLen]]; 
             channel.image_ = image; 
         } 
          [fChannels addObject:channel]; 
         [channel release]; 
     } 
     sqlite3_finalize(statement); 
 }

 iphone访问本地数据库sqlite3

Phone也支持访问本地数据库**Sqlite 3**。这里简单的介绍一下**iPhone**上**Sqlite 3**的使用方法。

首先需要在项目中引用 Sqlite 3的开发包,下面是在iPhone SDK
3.0下的目录:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/libsqlite3.0.dylib

到这里你需要事先用命令来创建 Sqlite
3
的数据库文件,并在其中创建自己的表等等,然后作为资源文件添加到项目,然后在程序第一次运行的时候复制到程序下的Documents或其他目录下,关于
Sqlite 3的基本操作网上已经有不少文章,这里就不重复了。

在iPhone中使用 Sqlite 3主要步骤如下:

1 首先获取iPhone上 Sqlite 3的数据库文件的地址

2 打开 Sqlite 3的数据库文件

3 定义SQL文

4 邦定执行SQL所需要的参数

5 执行SQL文,并获取结果

6 释放资源

7 关闭 Sqlite 3数据库。

下面结合代码来示范一下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 首先获取iPhoneSqlite3的数据库文件的地址  
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *documentsDirectory = [paths objectAtIndex:0];  
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];  
// 打开Sqlite3的数据库文件  
sqlite3 *database;  
sqlite3_open([path UTF8String], &database);  
// 定义SQL文  
sqlite3_stmt *stmt;  
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";  
sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);  
// 邦定第一个int参数  
sqlite3_bind_int(stmt, 1, 1);  
// 邦定第二个字符串参数  
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);  
// 执行SQL文,并获取结果  
sqlite3_step(stmt);  
// 释放资源  
sqlite3_finalize(stmt);  
// 关闭Sqlite3数据库  
sqlite3_close(database);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值