標籤:sqlite3 模型 資料庫連接 資料庫中擷取資料 資料庫
sqlite 的介紹:
sqlite是c語言寫的一個開源庫,它實現的是一個開源的自自包含的SQL關係型的資料庫引擎,可以使用sqlite儲存大量關聯資料。可以嵌入到iPhone或者ipad的裝置上面。
優點:
1、sqlite是一個完全自包含(獨立性比較高)的Sql資料庫引擎,
1)所以所有的資料庫資料都被儲存在一個單獨的、跨平台的磁碟中;
2)它需要幾個外部庫和一點點的作業系統的支援。
2、sqlite所佔用的空間是非常的曉得。大概只是300k
3、sqlite不需要配置、安裝以及管理員的過程。
4、sqlite支援了很多的sql的特性,然而還有一些特性沒有支援,可以查看官方文檔;
區別:
core Data:core DataAPI(API)被設計用來在ios上儲存資料。擅長管理在裝置上建立資料。
(1)是一個架構,而不是一個關係型資料庫,主要的目的是提供給開發人員一個架構,用來儲存應用程式建立的對象;
(2)可以使用豐富的API集在代碼中操作這些對象,也就是mvc中的模型的建立;
(3)可以使用sqlite以及其他的儲存類型作為資料的後台儲存(但:注意它不是關係型資料庫的實現)。
(4)它不是以開發人員直接存取儲存。如果只需持久化應用程式使用期間使用期間建立的對象,則應該考慮使用core Data。
sqlite:當需要積極式載入具有大量資料的應用程式的時候,sqlite表現就比較突出。eg:地圖上的GPS功能,這些表現為預先載入比較強烈的功能。如果需要使用關係型資料庫儲存的功能,應該考慮直接使用sqlite,
有關sqlite3中的一些詳細內容的引用:
1、sqlite3 catalog.db 啟動sqlite3工具,並且建立了一個catalog.db的資料庫
2、attach database 命令 、附加現有的資料庫到sqlite工具 、或者指定的檔案不存在的時候建立資料庫
3、可以附加多個資料庫大一個命令列工具執行個體,並且以資料庫名稱.表名稱的格式使用點符號在每一個資料庫中引用資料
4、可以將一個資料從一個資料庫遷移到另外一個資料庫中。
sqlite中存在很多元命令(metacommmands),用來控制工具自身。
eg:sqlite中以“.”符號執行的元命令是不需要“;”符號結束的。可以在進入sqlite的環境下之後執行 .help 來查看命令。
而一些其他語句沒有以“.”符號開始的時候,就需要“;”符號結束。
xcode中使用sqlite3資料庫:
0、添加所需要的架構libsqlite3.0.dylib ,這個動態庫整合了想所有的sqlite的操作,顯示介面。
1、添加資料庫,eg:添加catalog.db 到xcode項目的suport的目錄下。
2、建立模型,eg:對應著資料庫中的表,然後就是建立和資料庫職工的欄位一樣的名字的屬性,這樣不容易出現錯誤。轉化不用那麼麻煩。(屬性 <——————> 欄位)它們之間一一對應。
3、建立串連資料庫的底層類,並且建立擷取資料,修改資料的等等方法,這裡需要調用資料庫sqlite的介面的方法。
聲明:下面的代碼是引用別人的:
代碼:
啟動並執行結果圖:
下面是程式中主要的代碼:
模型product的代碼:
product.h 的檔案愛你#import <Foundation/Foundation.h>//這個就是模型類,對應這資料庫中的屬性欄位。@interface Product : NSObject { int ID; NSString* name; NSString* manufacturer; NSString* details; float price; int quantity; NSString* countryOfOrigin; NSString* image;}@property (nonatomic) int ID;@property (strong, nonatomic) NSString *name;@property (strong, nonatomic) NSString *manufacturer;@property (strong, nonatomic) NSString *details;@property (nonatomic) float price;@property (nonatomic) int quantity;@property (strong, nonatomic) NSString *countryOfOrigin;@property (strong, nonatomic) NSString *image;@end
product.m檔案,尤其這樣實現是為了和在欄位中的屬性名稱字對應。#import "Product.h"@implementation Product@synthesize ID;@synthesize name;@synthesize manufacturer;@synthesize details;@synthesize price;@synthesize quantity;@synthesize countryOfOrigin;@synthesize image;@end
下面是DBAccess類的代碼:
DBAccess.h檔案。#import <Foundation/Foundation.h>// This includes the header for the SQLite library.#import <sqlite3.h>#import "Product.h"//用來擷取資料庫中的資料,添加到模型中庫@interface DBAccess : NSObject { }//擷取的數組方法- (NSMutableArray*) getAllProducts;//關閉資料庫- (void) closeDatabase;//初始化資料庫,包括開啟資料庫- (void)initializeDatabase;@end
DBAccess.m檔案。#import "DBAccess.h"@implementation DBAccess// Reference to the SQLite database.sqlite3* database;//初始化方法,整合NSObject類,啟動的時候就會調用這個方法。-(id) init{ if ((self = [super init])) { [self initializeDatabase]; } return self;}// 擷取資料庫檔案、開啟、串連- (void)initializeDatabase { // Get the database from the application bundle. NSString *path = [[NSBundle mainBundle] pathForResource:@"catalog" ofType:@"db"]; // Open the database. if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) { NSLog(@"Opening Database"); } else { // Call close to properly clean up sqlite3_close(database); NSAssert1(0, @"Failed to open database: ‘%s’.", sqlite3_errmsg(database)); }}//關閉資料庫-(void) closeDatabase{ // Close the database. if (sqlite3_close(database) != SQLITE_OK) { NSAssert1(0, @"Error: failed to close database: ‘%s’.", sqlite3_errmsg(database)); }}//擷取資料庫中product的所有記錄儲存到數組中- (NSMutableArray*) getAllProducts{ NSLog(@"擷取資料"); // The array of products that we will create NSMutableArray *products = [[NSMutableArray alloc] init]; // The SQL statement that we plan on executing against the database 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"; // The SQLite statement object that will hold our result set sqlite3_stmt *statement; // Prepare the statement to compile the SQL query into byte-code int sqlResult = sqlite3_prepare_v2(database, sql, -1, &statement, NULL); if ( sqlResult== SQLITE_OK) { // Step through the results - once for each row. //#define SQLITE_ROW sqlite3_step() has another row ready while (sqlite3_step(statement) == SQLITE_ROW) { // allocate a Product object to add to products array Product *product = [[Product alloc] init]; // The second parameter is the column index (0 based) in // the result set. char *name = (char *)sqlite3_column_text(statement, 1); char *manufacturer = (char *)sqlite3_column_text(statement, 2); char *details = (char *)sqlite3_column_text(statement, 3); char *countryOfOrigin = (char *)sqlite3_column_text(statement, 6); char *image = (char *)sqlite3_column_text(statement, 7); // Set all the attributes of the product product.ID = sqlite3_column_int(statement, 0); product.name = (name) ? [NSString stringWithUTF8String:name] : @""; product.manufacturer = (manufacturer) ? [NSString stringWithUTF8String:manufacturer] : @""; product.details = (details) ? [NSString stringWithUTF8String:details] : @""; product.price = sqlite3_column_double(statement, 4); product.quantity = sqlite3_column_int(statement, 5); product.countryOfOrigin = (countryOfOrigin) ? [NSString stringWithUTF8String:countryOfOrigin] : @""; product.image = (image) ? [NSString stringWithUTF8String:image] : @""; // 將產品添加到Products數組中並且移到下一行 [products addObject:product]; } //釋放和編譯器語句有關的資源 sqlite3_finalize(statement); } else { NSLog(@"Problem with the database:"); NSLog(@"%d",sqlResult); } return products;}@end
上面的兩個類只要是建立資料庫在應用中的模型,並且串連資料庫擷取資料庫中相應的操作。
在Controller中使用來顯示在View中的代碼:
- (void)viewDidLoad{ [super viewDidLoad]; DBAccess *dbAccess = [[DBAccess alloc] init]; self.products = [dbAccess getAllProducts]; //前面應該定義了products這個屬性。 [dbAccess closeDatabase]; }
原始碼下載串連:
http://www.wrox.com/WileyCDA/WroxTitle/Professional-iOS-Database-Application-Programming-2nd-Edition.productCd-1118391845,descCd-DOWNLOAD.html
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
sqlite的應用執行個體