在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);
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];
}