在ios開發中,如果本地需要做大量的快取,fmdb用的是比較多的,怎麼整合到專案中我這裡就不說了,主要說一下fmdb使用的乙個思路和自己遇到的坑。
在我自己開發聊天系統的時候,我一般是用fmdb用來快取最近聯絡人列表和使用者的聊天訊息列表。因為聊天系統,涉及到的讀和寫比較頻繁,所以我會封裝乙個單例類用來處理每個部分的資料儲存和讀寫。
下面是用來管理最近聯絡人快取的功能實現,其餘的模組也可以按照這樣的模式來,封裝好方法,操作的時候直接調方法即可,比較方便。
先看一下.h檔案的**,這樣大致就可以知道這個類主要用來幹什麼:
#import @class fmdatabase;
@inte***ce ******chatcache : nsobject
+(instancetype)sharedchatcache;
//設定使用者uid
-(bool)initialize:(nsstring*)myuserid;
-(void)uninitialize;
//獲取所有使用者資訊
-(void)getuserall:(void(^)(nsmutablearray*))callback;
//插入或者更新新的資料
-(void)upsert:(nsdictionary*)data;
//設定某個使用者未讀資訊條數為0
-(void)setunreadnum:(nsstring*)targetuserid andnum:(int)num;
//設定某個群未讀資訊條數為0
-(void)setgroupunreadnum:(nsstring *)targetgroupid andnum:(int)num;
//獲取未讀訊息數
-(void)getunreadnum:(nsstring*)targetuserid andcallback:(void(^)(int))callback;
//獲取某個群未讀條數
-(void)getgroupunreadnum:(nsstring *)targetgroupid andcallback:(void(^)(int))callback;
//刪除某人的聊天記錄
-(void)remove:(nsstring*)targetuserid;
//刪除某一條群聊
-(void)removegroup:(nsstring *)groupid;
//清理資料,除了世界聊天
-(void)clearcacheswithoutworld;
@end
.m檔案:
#import "******chatcache.h"
#import "fmdb.h"
fmdatabasequeue* __g_db = nil;
@inte***ce ******chatcache()
@end
@implementation ******chatcache
+(instancetype)sharedchatcache
});return sharedrunner;
}-(bool)initialize:(nsstring*)myuserid
return (__g_db != nil);
}-(void)uninitialize
-(void)dealloc
nslog(@"******chatcache dealloc");
}-(void)createtable
} else
}];});
}-(void)upgradetable:(fmdatabase*)db
-(void) checktablestruct
//獲取所有使用者資訊
-(void)getuserall:(void(^)(nsmutablearray*))callback
[rs close];
dispatch_async(dispatch_get_main_queue(), ^
});}];
});}//插入或者更新新的資料
-(void)upsert:(nsdictionary*)data
}elseelse
[db executeupdate:sql];
}}else else
[db executeupdate:sql];
} else
} }];
});}//設定某個使用者未讀資訊條數為0
-(void)setunreadnum:(nsstring*)targetuserid andnum:(int)num ];
});}//設定某個群未讀資訊條數為0
-(void)setgroupunreadnum:(nsstring *)targetgroupid andnum:(int)num
]; });
}//獲取未讀訊息數
-(void)getunreadnum:(nsstring*)targetuserid andcallback:(void(^)(int))callback
});}];
});}//獲取某個群未讀條數
-(void)getgroupunreadnum:(nsstring *)targetgroupid andcallback:(void(^)(int))callback
});}];
});}-(void)remove:(nsstring*)targetuserid ];
});}//刪除某一條群聊
-(void)removegroup:(nsstring *)groupid
]; });
}//清理資料
-(void)clearcacheswithoutworld ];
});}@end
我們會看到單例例項化的時候有這樣一句**:
if(!__g_db)
這句**可以保證整個程式中只存在乙個fmdatabasequeue的例項物件。
因為首先fmdatabase是不具備執行緒安全的,如果兩個執行緒中同時運算元據庫,就會」is currently in use」 ;fmdatabasequeue其實是乙個序列的排程佇列(g-c-d),資料庫的操作必須是順序執行,不能兩個資料庫的操作同時執行,如果是兩個執行緒各自建立了fmdatabasequeue的例項,執行緒同時執行時,就會出現相同的資料庫操作同時觸發,導致」database is locked「,所以如果是乙個fmdatabasequeue例項下,多個執行緒下同時操作,其實是在排在同乙個佇列中逐一操作的,沒有同時操作。這樣就可以保證fmdatabase的資料是執行緒安全的。
所以在使用fmdb的時候一定要使用fmdatabasequeue,這個是fmdb用來管理資料庫的,可以避免很多麻煩。
另外需要注意的是在使用sql語句的時候,如果涉及到字串,佔位符就需要使用單引號,否則也會遇到問題。
iOS中FMDB的使用
1什在日常的開發中,我們需要用到離線快取將資料資訊存入資料庫,在沒有網路的時候進行載入,而我們ios用的就是sqlite3資料庫,用原生的sql我們也能實現,但是書寫起來比較麻煩,尤其是其它語言轉過來的程式設計師會感覺吃力,下面我們介紹一款比較優秀還簡單的第三方fmdb 4 fmdb常用類 fmda...
iOS開發 FMDB的使用
獲取沙盒路徑 nsarray filepath nssearchpathfordirectoriesindomains nsdocumentdirectory,nsuserdomainmask,yes nsstring documentpath filepath objectatindex 0 ns...
iOS開發 FMDB使用
demo位址 nslog path database fmdatabase alloc initwithpath path id欄位為自增欄位 name char 256位 age char 3位 char 2位 phone char 13位 address char 100位的 if databa...