sqlite是c语言写的一个开源库,它实现的是一个开源的自自包含的sql关系型的数据库引擎,可以使用sqlite存储大量关联数据。可以嵌入到iPhone或者ipad的设备上面。
优点:
1、sqlite是一个完全自包含(独立性比较高)的sql数据库引擎,
1)所以所有的数据库数据都被存储在一个单独的、跨平台的磁盘中;
2)它需要几个外部库和一点点的操作系统的支持。
2、sqlite所占用的空间是非常的晓得。大概只是300k
3、sqlite不需要配置、安装以及管理员的过程。
4、sqlite支持了很多的sql的特性,然而还有一些特性没有支持,可以查看官方文档;
区别:
core Data:core Data应用程序编程接口(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
上面的两个类只要是创建数据库在应用中的模型,并且连接数据库获取数据库中相应的操作。
- (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