iOS中持久化存储SQLite(一)
2016-02-17 08:43
323 查看
在iOS中做持久化存储有多种方案,其中包括plist, preference, sqlite, core data,其中:
(1)plist, preference适合小型数据存储,因为每次存储前都必须将文件内容读到内存中,因此如果数据量过大就会占用大量的内存,同时修改与查询也不是很方便,都必须读入内存中,自己来写相应的查询函数来查询结果。
(2)sqlite为嵌入式系统中使用的持久化存储数据库方案,其量级比较轻,因此只需要占用几百空间就能达到数据库的效果,方便数据的增删查改。在iOS中其数据库操作分为纯C语言接口以及对其进行OC封装的接口第三方库FMDB
(3)Core Data为苹果自己在Sqlite的上封装的数据存储方案,虽然其屏蔽了数据库操作的语句,但是其量级比较重。
下面就介绍如何使用纯C语言接口来操作数据库:
1.数据库的打开
- (void)setUpDB {
NSString *fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@”shop.sqlite”];
int status = sqlite3_open(fileName.UTF8String, &_db);
if (status == SQLITE_OK) {
NSLog(@”打开数据库成功”);
// 创表
const char *sql = “CREATE TABLE IF NOT EXISTS t_shop (id integer PRIMARY KEY, name text NOT NULL, price real)”;
char *errmsg = NULL;
sqlite3_exec(self.db, sql, NULL, NULL, &errmsg);
if (errmsg) {
NSLog(@”创建表失败 - %s”, errmsg);
}
} else {
NSLog(@”打开数据库失败”);
}
}
2.安装数据
- (void)setUpData {
const char *sql = “SELECT name, price FROM t_shop”;
sqlite3_stmt *stmt = NULL;
int status = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL);
}
3.插入数据
- (IBAction)insert:(UIButton *)sender {
NSString *sql = [NSString stringWithFormat:@”INSERT INTO t_shop(name, price) VALUES (‘%@’, %f);”, self.nameField.text, self.priceField.text.doubleValue];
sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, NULL);
}
4.搜索数据
- (void)searchBar:(UISearchBar )searchBar textDidChange:(NSString )searchText {
[self.shops removeAllObjects];
NSString *sql = [NSString stringWithFormat:@”SELECT name, price FROM t_shop WHERE name LIKE ‘%%%@%%’ OR price LIKE ‘%%%@%%’”, searchText, searchText];
sqlite3_stmt *stmt = NULL;
}
(1)plist, preference适合小型数据存储,因为每次存储前都必须将文件内容读到内存中,因此如果数据量过大就会占用大量的内存,同时修改与查询也不是很方便,都必须读入内存中,自己来写相应的查询函数来查询结果。
(2)sqlite为嵌入式系统中使用的持久化存储数据库方案,其量级比较轻,因此只需要占用几百空间就能达到数据库的效果,方便数据的增删查改。在iOS中其数据库操作分为纯C语言接口以及对其进行OC封装的接口第三方库FMDB
(3)Core Data为苹果自己在Sqlite的上封装的数据存储方案,虽然其屏蔽了数据库操作的语句,但是其量级比较重。
下面就介绍如何使用纯C语言接口来操作数据库:
1.数据库的打开
- (void)setUpDB {
NSString *fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@”shop.sqlite”];
int status = sqlite3_open(fileName.UTF8String, &_db);
if (status == SQLITE_OK) {
NSLog(@”打开数据库成功”);
// 创表
const char *sql = “CREATE TABLE IF NOT EXISTS t_shop (id integer PRIMARY KEY, name text NOT NULL, price real)”;
char *errmsg = NULL;
sqlite3_exec(self.db, sql, NULL, NULL, &errmsg);
if (errmsg) {
NSLog(@”创建表失败 - %s”, errmsg);
}
} else {
NSLog(@”打开数据库失败”);
}
}
2.安装数据
- (void)setUpData {
const char *sql = “SELECT name, price FROM t_shop”;
sqlite3_stmt *stmt = NULL;
int status = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL);
if (status == SQLITE_OK) { while (sqlite3_step(stmt) == SQLITE_ROW) { const char *name = (const char *)sqlite3_column_text(stmt, 0); const char *price = (const char *)sqlite3_column_text(stmt, 1); FPShop *shop = [[FPShop alloc] initWithName:[NSString stringWithUTF8String:name] price:[NSString stringWithUTF8String:price]]; [self.shops addObject:shop]; } }
}
3.插入数据
- (IBAction)insert:(UIButton *)sender {
NSString *sql = [NSString stringWithFormat:@”INSERT INTO t_shop(name, price) VALUES (‘%@’, %f);”, self.nameField.text, self.priceField.text.doubleValue];
sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, NULL);
FPShop *shop = [[FPShop alloc] initWithName:self.nameField.text price:self.priceField.text]; [self.shops addObject:shop]; [self.tableView reloadData];
}
4.搜索数据
- (void)searchBar:(UISearchBar )searchBar textDidChange:(NSString )searchText {
[self.shops removeAllObjects];
NSString *sql = [NSString stringWithFormat:@”SELECT name, price FROM t_shop WHERE name LIKE ‘%%%@%%’ OR price LIKE ‘%%%@%%’”, searchText, searchText];
sqlite3_stmt *stmt = NULL;
int status = sqlite3_prepare_v2(self.db, sql.UTF8String, -1, &stmt, NULL); if (status == SQLITE_OK) { while (sqlite3_step(stmt) == SQLITE_ROW) { const char *name = (const char *) sqlite3_column_text(stmt, 0); const char *price = (const char *)sqlite3_column_text(stmt, 1); FPShop *shop = [[FPShop alloc] initWithName:[NSString stringWithUTF8String:name] price:[NSString stringWithUTF8String:price]]; [self.shops addObject:shop]; } } [self.tableView reloadData];
}
相关文章推荐
- mysql中的多行查询结果合并成一个
- 关于oracle 11g自动分区+分区改名+定时任务综合使用实现自动分区后可以进行分区查询
- 如何连接新浪sae共享数据库
- NoSql basic knowledge
- powerdesigner反向SQLServer2008数据库生成物理数据模型
- mysql数据库delete数据时不支持表别名
- 在使用SQLServer时忘记sa账号密码解决办法
- (转载)数据库表分割技术浅析(水平分割/垂直分割/库表散列)
- 使用PreparedStatement的setString方法会自动在数据库相应表项后面补空格解决
- PHPMEMCACHE安装
- linux安装mongodb
- mongodb windows下以及linux下的配置
- MYSQL优化查询
- Windows下redis 安装与PHP使用
- MYSQL查询语句优化
- mysql 和 mongo db 语法对比
- 数据库备份需要注意的
- JAVA通过Redis设置集合并读取json
- php操作MONGODB
- 阿里云搭建NODEJS+EXPRESS+MONGODB实战