- 須知: (1)歸檔(2)偏好設(shè)置(3)Plist存儲(chǔ):都不適合處理大批量數(shù)據(jù)的存儲(chǔ),大批量數(shù)據(jù)通常使用數(shù)據(jù)庫(kù)來(lái)進(jìn)行存儲(chǔ);
- 對(duì)數(shù)據(jù)庫(kù)的操作:通常情況下是啟動(dòng)程序立即打開(kāi)數(shù)據(jù)庫(kù),所以在
AppDelegate.m
文件didFinishLaunchingWithOptions
方法中打開(kāi)數(shù)據(jù)庫(kù)(如果沒(méi)有則先創(chuàng)建,再打開(kāi))
- 數(shù)據(jù)庫(kù)的操作應(yīng)該封裝成工具類,在這個(gè)工具類里面對(duì)外提供接口,方便外界的CRUD操作;
- 封裝的這個(gè)工具類,設(shè)計(jì)成單例,非絕對(duì)的單例
- 使用
sqlite3
,應(yīng)該手動(dòng)導(dǎo)入這個(gè)框架
- 具體步奏如下
- 1.創(chuàng)建表
- 2.執(zhí)行sql語(yǔ)句
- 3.查看的所有數(shù)據(jù)
1.單例設(shè)計(jì)
+ (instancetype)shareIntance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
2.定義一個(gè)數(shù)據(jù)庫(kù)對(duì)象,注意用assign修飾
@interface SQLiteManager ()
@property (nonatomic, assign) sqlite3 *db;
@end
3.打開(kāi)數(shù)據(jù)庫(kù)方法
- (BOOL)openDB
{
// 數(shù)據(jù)庫(kù)文件存放的路徑(沙盒中)
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 全路徑
filePath = [filePath stringByAppendingPathComponent:@"demo.sqlite"];
// 1> 參數(shù)一:文件路徑+文件名字
// 2> 參數(shù)二:數(shù)據(jù)庫(kù)對(duì)象
if (sqlite3_open(filePath.UTF8String, &_db) != SQLITE_OK) {
NSLog(@"數(shù)據(jù)庫(kù)打開(kāi)失敗");
return NO;
}
// 創(chuàng)建表
return [self createTable];
}
4.創(chuàng)建表的方法
- (BOOL)createTable
{
// 1.封裝創(chuàng)建表的語(yǔ)句-->注意標(biāo)點(diǎn)符號(hào)分號(hào),要包括在內(nèi)
NSString *createTableSQL = @"CREATE TABLE IF NOT EXISTS 't_student' ( 'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER);";
// 2.執(zhí)行sql語(yǔ)句
return [self execSQL:createTableSQL];
}
5.執(zhí)行sql語(yǔ)句的方法
- (BOOL)execSQL:(NSString *)sql
{
// 1> 參數(shù)一:數(shù)據(jù)庫(kù)對(duì)象
// 2> 參數(shù)二:要執(zhí)行的sql語(yǔ)句
return sqlite3_exec(self.db, sql.UTF8String, nil, nil, nil) == SQLITE_OK;
}
6.返回要查看的所有數(shù)據(jù)的數(shù)組
- (NSArray *)querySQL:(NSString *)querySQL
{
// 定義游標(biāo)對(duì)象
sqlite3_stmt *stmt = nil;
// 準(zhǔn)備查詢
// 1> 參數(shù)一:數(shù)據(jù)庫(kù)對(duì)象
// 2> 參數(shù)二:查詢語(yǔ)句
// 3> 參數(shù)三:查詢語(yǔ)句的長(zhǎng)度:-1
// 4> 參數(shù)四:句柄(游標(biāo)對(duì)象)
if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
NSLog(@"準(zhǔn)備查詢失敗");
return nil;
};
// 準(zhǔn)備成功,開(kāi)始查詢數(shù)據(jù)
NSMutableArray *dictArray = [NSMutableArray array];
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 獲取一共多少列
int count = sqlite3_column_count(stmt);
// 定義字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (int i = 0; i < count; i++) {
// 取出i位置列的字段名,作為字典的鍵
const char *cKey = sqlite3_column_name(stmt, i);
NSString *key = [NSString stringWithUTF8String:cKey];
// 取出i位置的存儲(chǔ)的值,作為字典的值
const char *cValue = (const char *)sqlite3_column_text(stmt, i);
NSString *value = [NSString stringWithUTF8String:cValue];
// 將鍵值對(duì)一個(gè)一個(gè)放入字典中
[dict setValue:value forKey:key];
}
// 將獲取的字典放入數(shù)組中
[dictArray addObject:dict];
}
// 返回取出所有數(shù)據(jù)的數(shù)組
return dictArray;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者