今天介紹下iOS數(shù)據(jù)持久化存儲(chǔ)之一:數(shù)據(jù)庫。
蘋果為我們提供了抽象化的數(shù)據(jù)庫管理工具CoreData诈乒,其本質(zhì)依舊是生成sqlite文件存儲(chǔ)在沙盒目錄下罩扇,只是封裝成對(duì)象,免去了我們寫sql語句的煩惱怕磨,MagicalRecord是一個(gè)第三方開源庫喂饥,封裝了系統(tǒng)的CoreData,使代碼不再那么晦澀難懂肠鲫。
一员帮、創(chuàng)建數(shù)據(jù)庫文件 右鍵New File 創(chuàng)建CoreData DataModel 其實(shí)就是一個(gè)可視化的數(shù)據(jù)庫
我們起名為StudyMRSqlite 如下圖生成了這個(gè)StudyMRSqlite.scdatamodeld
二、創(chuàng)建一張表导饲,然后點(diǎn)擊左下角的Add Entity 增加一張表 我們給這張表起名為StudyModel
構(gòu)建表結(jié)構(gòu) 點(diǎn)擊Attributes左下角的加號(hào) 在這張表中 增加int類型的age和string類型的name兩個(gè)元素
選擇語言 我的工程使用OC所以選擇了Objective_C
@谈摺B炔摹!接下來敲黑板 一定要把StudyModel右側(cè)面板的Codegen改為 Manual/None 硝岗,不然你后面create nsmanagerobject subclass時(shí)會(huì)報(bào)重復(fù)定義的錯(cuò)誤氢哮,到時(shí)候你肯定還會(huì)哭著回來找我??
三、創(chuàng)建model文件 Editor——create nsmanagerobject subclass
生成了四個(gè)文件 相當(dāng)于我們的model文件型檀,接下來用到數(shù)據(jù)庫的時(shí)候需要引入其中兩個(gè).h頭文件
可以看到其中就有我們剛才添加的兩個(gè)屬性name和age冗尤,
四、在AppDelegate的didFinishLaunchingWithOptions方法里 初始化數(shù)據(jù)庫胀溺,并起名為MyRunningDataBase.sqlite 這個(gè)初始化方法是創(chuàng)建一個(gè)可以數(shù)據(jù)遷移的數(shù)據(jù)庫裂七,因?yàn)槲覀兙€上的用戶會(huì)有一些數(shù)據(jù)在庫中,當(dāng)我們下個(gè)版本改了表結(jié)構(gòu)的時(shí)候再次上線需要將老用戶的數(shù)據(jù)遷移到新的表中仓坞,這樣就不會(huì)丟失數(shù)據(jù)了背零。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//名字為MyRunningDataBase.sqlite 可以數(shù)據(jù)遷移的數(shù)據(jù)庫 相應(yīng)的還有其他的初始化方法 可以去查看API
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MyRunningDataBase.sqlite"];
NSString *path = [[NSPersistentStore MR_urlForStoreName:@"MyRunningDataBase.sqlite"] absoluteString];
path = [path stringByReplacingOccurrencesOfString:@"%20" withString:@" "];
}
- (void)applicationWillTerminate:(UIApplication *)application {
//關(guān)閉數(shù)據(jù)庫
[MagicalRecord cleanUp];
}
在模擬器下運(yùn)行,打印MyRunningDataBase.sqlite的沙盒路徑无埃,點(diǎn)擊MAC桌面——前往文件夾進(jìn)入沙盒徙瓶,通過沙盒可以看到其本質(zhì)還是創(chuàng)建.sqlite 文件
打開這個(gè)MyRunningDataBase.sqlite文件可以看到如下圖所示內(nèi)容
五、再說說數(shù)據(jù)遷移Editor —— Add Model Version
使用默認(rèn)名字StudyMRSqlite 2即可
在右側(cè)面板選擇StudyMRSqlite 2為當(dāng)前版本 這樣線上的用戶數(shù)據(jù)就會(huì)遷移到新表中
接下來開始上代碼
OK 接下來說說MagicalRecord的增刪改查
增加數(shù)據(jù)
StudyModel *student = [StudyModel MR_createEntity];//新建一條記錄
student.name = @"張三";
student.age = arc4random()%100 + 1;
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];//保存數(shù)據(jù)
查詢數(shù)據(jù) 多種方式查詢 用的較多的就是謂詞查詢
//1.謂詞多條件查詢 實(shí)際應(yīng)用中用的最多的就是這種 給幾個(gè)變量 然后查出來符合條件的model排序給一個(gè)model數(shù)組
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@ && age=%d",@"李四",18];//多條件謂詞查詢
NSArray *dataArr = [StudyModel MR_findAllSortedBy:@"age" ascending:YES withPredicate:predicate];//按照年齡大小排序
for (StudyModel *student in dataArr)
{
NSLog(@"%@ %lld",student.name,student.age);
}
//2.根據(jù)某一條件查詢
NSArray *dataArr2 = [StudyModel MR_findByAttribute:@"name" withValue:@"李四"];
for (StudyModel *student in dataArr2)
{
NSLog(@"dataArr2%@ %lld",student.name,student.age);
}
//這張表中所有的數(shù)據(jù)
NSArray *dataArr3 = [StudyModel MR_findAll];
for (StudyModel *student in dataArr3)
{
NSLog(@"dataArr3%@ %lld",student.name,student.age);
}
改變數(shù)據(jù) 先根據(jù)條件查出來再修改
//根據(jù)條件查詢出內(nèi)容然后修改
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@",@"張三",18];//多條件謂詞查詢
NSArray *dataArr = [StudyModel MR_findAllSortedBy:@"age" ascending:YES withPredicate:predicate];//按照年齡大小排序
for (StudyModel *student in dataArr)
{
student.age = 119;//修改數(shù)據(jù)
}
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];//保存數(shù)據(jù)
刪除數(shù)據(jù) 先根據(jù)條件查出來再刪除
//1.根據(jù)某些條件刪除數(shù)據(jù)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@ && age=%d",@"張三",18];//多條件謂詞查詢
NSArray *dataArr = [StudyModel MR_findAllSortedBy:@"age" ascending:YES withPredicate:predicate];//按照年齡大小排序
for (StudyModel *student in dataArr)
{
[student MR_deleteEntity];//刪除
}
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];//保存數(shù)據(jù)
//刪除一張表中所有的數(shù)據(jù)
[StudyModel MR_truncateAll];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
寫了個(gè)小Demo 點(diǎn)這里
以上录语。