今天決定給手上的項目加上一個數(shù)據(jù)庫涂佃,用來進行數(shù)據(jù)持久化操作,關(guān)于在iOS端的數(shù)據(jù)持久化方式的差異缚去,這里也就不再贅述,相信如果真實使用并且去感受過的人琼开,有自己的評判標準易结。
在比較了Realm
、SQLite
之后,我決定在項目中依然使用SQLite
數(shù)據(jù)庫搞动,并切還是使用FMDB
這個第三方庫來簡化操作躏精。(Realm我是覺得體積龐大,至于CoreData問我為什么不用滋尉,小心我打人哦)玉控。
SQLite
語句,從我自身來說狮惜,感覺其實沒有那么好的記憶力高诺,所以我又花了一點點時間來溫習FMDB
的常規(guī)操作,想到自己從來沒有總結(jié)過數(shù)據(jù)庫這方面的知識碾篡,今天就花一點點時間虱而,對iOS端SQLite
數(shù)據(jù)庫做一點操作層面的總結(jié)。
SQLite
數(shù)據(jù)庫开泽,其實并不難學牡拇,打敗許多初學者的,我覺得應該是它C語言中繁瑣的API穆律。我之前說我記不住惠呼,這套API,我真的看幾次忘幾次峦耘。所以才有了應運而生的FMDB
剔蹋。
建表以及關(guān)閉表
使用數(shù)據(jù)庫的第一件事,就是建立一個數(shù)據(jù)庫辅髓。要注意的是泣崩,在iOS環(huán)境下,只有document
directory
是可以進行讀寫的洛口。在寫程序時用的那個Resource
資料夾底下的東西都是read-only矫付。因此,建立的資料庫要放在document
資料夾下第焰。方法如下:
//建表
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"doc = %@", doc);
NSString *fileName = [doc stringByAppendingPathComponent:@"device.sqlite"];
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
if ([db open]) {
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS Device (deviceID text, deviceName text, deviceType integer, deviceStatus integer);"];
if (result) {
NSLog(@"創(chuàng)建表成功");
} else {
NSLog(@"建表失敗");
}
}
這樣簡單的操作就已經(jīng)完成了數(shù)據(jù)庫的創(chuàng)建买优,每一行代碼都很好理解,先是找到程序在沙盒中的路徑挺举,之后填寫數(shù)據(jù)庫的名字杀赢,完成創(chuàng)建。如果創(chuàng)建數(shù)據(jù)庫成功豹悬,那么我們就創(chuàng)建一個名字叫Device
的表葵陵,這個設備表里有 deviceID, deviceName, deviceType, deviceStatus
四個字段,他們的類型分別是text瞻佛、text脱篙、integer娇钱、integer
。
關(guān)于CURD
插入數(shù)據(jù)
首先绊困,我們對我們的DeviceModel
的模型文件聲明屬性文搂,
#import <Foundation/Foundation.h>
@interface DeviceModel : NSObject
@property (nonatomic, copy) NSString *deviceName;
@property (nonatomic, copy) NSString *deviceID;
@property (nonatomic, assign) NSInteger deviceType;
@property (nonatomic, assign) NSInteger deviceStatus;
- (instancetype)initWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus;
+ (instancetype)DeviceWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus;
@end
在.m文件中寫好它的初始化方法
#import "DeviceModel.h"
@implementation DeviceModel
- (instancetype)initWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus {
self = [super init];
if (self) {
_deviceName = deviceName;
_deviceID = deviceID;
_deviceType = deviceType;
_deviceStatus = deviceStatus;
}
return self;
}
+ (instancetype)DeviceWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus {
DeviceModel *model = [[DeviceModel alloc] initWithDeviceName:deviceName DeviceID:deviceID DeviceType:deviceType DeviceStatus:deviceStatus];
return model;
}
@end
接下來是插入數(shù)據(jù)了
插入數(shù)據(jù)跟前面一樣,用executeUpdate
后面加語法就可以了秤朗。比較不同的是煤蹭,因為插入的數(shù)據(jù)會跟Objective-C
的變數(shù)有關(guān),所以在string
里使用?號來代表這些變數(shù)取视。
DeviceModel *model = [[DeviceModel alloc] initWithDeviceName:@"控制主機" DeviceID:@"0001" DeviceType:1 DeviceStatus:0];
[db executeUpdateWithFormat:@"INSERT INTO Device (deviceID, deviceName, deviceType, deviceStatus) VALUES (%@, %@, %ld, %ld);",model.deviceID, model.deviceName, model.deviceType, model.deviceStatus];
刪除更新數(shù)據(jù)
//刪除更新數(shù)據(jù)
NSString *device1 = @"0001";
[db executeUpdateWithFormat:@"delete from Device where deviceID = %@;", device1];
[db executeUpdateWithFormat:@"update Device set deviceStatus = %d where deviceID = %@", 1, device1];
查詢數(shù)據(jù)
//查詢數(shù)據(jù)
FMResultSet *resultSet = [db executeQuery:@"select * from Device"];
while ([resultSet next]) {
int type = [resultSet intForColumn:@"deviceType"];
int status = [resultSet intForColumn:@"deviceStatus"];
NSString *name = [resultSet objectForColumnName:@"deviceName"];
NSString *id = [resultSet objectForColumnName:@"deviceID"];
NSLog(@"type = %d , status = %d, name = %@, id = %@", type, status, name, id);
}
至此硝皂,F(xiàn)MDB的常用操作就已經(jīng)講完了,后面還會補上FMDB的多線程操作作谭。