iphone開發-SQLite數據庫使用

轉載自: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);  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章