資料持久化,好高階~哎,資料庫啊!!

kaihaOS發表於2016-04-06
IOS中的沙盒機制(SandBox)是一種安全體系,它規定了應用程式只能在為該應用建立的資料夾內讀取檔案,不可以訪問其他地方的內容。所有的非程式碼檔案都儲存在這個地方,比如圖片、聲音、屬性列表和文字檔案等。
1.每個應用程式都在自己的沙盒內
2.不能隨意跨越自己的沙盒去訪問別的應用程式沙盒的內容
3.應用程式向外請求或接收資料都需要經過許可權認證
一個沙盒中包含了四個部分:分別是.app檔案,這個就是可執行的應用檔案,Documents,蘋 果建議將程式中建立的或在程式中瀏覽到的檔案資料儲存在該目錄下,iTunes備份和恢復的時候會包括此目錄;Library,儲存程式的預設設定或其它 狀態資訊;Library/Caches:存放快取檔案,iTunes不會備份此目錄,此目錄下檔案不會在應用退出刪除;tmp,建立和存放臨時檔案的地 方。
13.SQLite (增刪改查,表)
NSString *strSql = [NSString stringWithFormat: @"INSERT INTO lanou20 (name,sex,age) VALUES ('%@','%@','%ld')" ,person.name,person.sex,person.age];
NSString *delSql = [NSString stringWithFormat:@"delete from lanou20 where pid = '%ld'",pid];
NSString *updataSql = [NSString stringWithFormat:@"UPDATE lanou20 SET name = '%@' WHERE  pid = '%ld' “,name,pid];
NSString *strSql = @"select * from lanou20”;
NSString *sql = @"CREATE  TABLE IF NOT EXISTS lanou20 (pid INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , name TEXT check(typeof(name) = 'text') , sex TEXT check(typeof(sex) = 'text') , age INTEGER)";
 
3.iOS中哪些資料持久化的方式,各有什麼特點,iOS平臺怎麼做資料的持久化,CoreData和sqlite有無必然聯絡?CoreData是一個關係型資料庫嗎?
答:iOS中可以有四種持久化資料的方式: 屬性列表、物件歸檔、SQLite3和Core Data;Core Data可以使你以圖形介面的方式快速的定義app的資料模型,同時在你的程式碼中容易獲取到它。core data提供了基礎結構去處理常用的功能,例如儲存,恢復,撤銷和重做,允許你在app中繼續建立新的任務。在使用Core Data的時候,你不用安裝額外的資料庫系統,因為core data使用內建的sqlite資料庫。Core Data將你app的模型層放入到一組定義在記憶體中的資料物件中。Core Data會追蹤這些物件的改變,同時可以根據需要做相反的改變,例如使用者執行撤銷命令。當Core Data在對你app資料的改變進行儲存的時候,Core Data會把這些資料歸檔,並永久性儲存。
mac os X中sqlite庫,它是一個輕量級功能強大的關係資料引擎,也很容易嵌入到應用程式。可以在多個平臺使用,sqlite是一個輕量級的嵌入式sql資料庫程式設計。與core data框架不同的是,sqlite是使用程式式的,sql的主要的API來直接運算元據表。
Core Data不是一個關係型資料庫,也不是關係型資料庫管理系統(RDBMS)。雖然Core Dta支援SQLite作為一種儲存型別,但它不能使用任意的SQLite資料庫。Core Data在使用的過程中自己建立這個資料庫。Core Data支援對一、對多的關係。
 
14.什麼是沙盒?
答:所謂的沙盒其實是作業系統為應用程式分配的一個密閉資料夾。應用程式擁有這個資料夾內檔案的訪問許可權,且只能對這個資料夾內的檔案進行操作(當然也可以訪問系統提供的檔案,比如:相簿),不可以去訪問其他應用程式的資料夾。
 
12.在沙盒中有幾個資料夾?
答:沙盒含有3個資料夾:Documents, Library 和 tmp
Documents:蘋果建議將程式中建立的或在程式中瀏覽到的檔案資料儲存在該目錄下,iTunes備份和恢復的時候會包括此目錄。
Library:儲存程式的預設設定或其它狀態資訊。
iTunes在與iPhone同步時,備份所有的Documents和Library檔案。
Library/Caches:存放快取檔案,一般是下載的圖片和視訊,iTunes不會備份此目錄,此目錄下檔案不會在應用退出刪除。
tmp:臨時資料夾,應用程式在重啟時,會丟棄所有的tmp檔案。
13.NSNotification和KVO的區別和用法是什麼?什麼時候應該使用通知,什麼時候應該使用KVO,它們的實現上有什麼區別?
獲取這些目錄路徑的方法:
1,獲取家目錄路徑的函式:
NSString *homeDir = NSHomeDirectory();
2,獲取Documents目錄路徑的方法:
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3,獲取Caches目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4,獲取tmp目錄路徑的方法:
NSString *tmpDir = NSTemporaryDirectory();
5,獲取應用程式程式包中資原始檔路徑的方法:
例如獲取程式包中一個圖片資源(apple.png)路徑的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 程式碼中的mainBundle類方法用於返回一個代表應用程式包的物件。
 
 
1、用coredata的時候,如果使用者更新個人資訊了,怎麼用程式碼來更新頁面上顯示的個人資訊
 
(1)當使用者更新了自己的使用者資訊,儲存更新資料到資料庫
(2)當使用者返回更新頁面時先查詢資料庫中的內容,顯示到頁面上就可以。
查詢資料庫的程式碼:
// 建立請求
NSFetchRequest *request = [[NSFetchRequest alloc] init];
 
// 建立實體描述
    NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:content];
    [request setEntity:entity];
    [request setReturnsObjectsAsFaults:NO];
 
// 設定謂詞
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self = %@", data];
    [request setPredicate:predicate];
 
// 執行請求
    NSArray *dataArray = [content executeFetchRequest:request error:nil];
 
// 修改資訊
    if ([dataArray count] > 0) {
        TaskTypeEntity *taskTypeEntity = [dataArray objectAtIndex:0];
        taskTypeEntity.color = data.color;
        taskTypeEntity.status = data.status;
        taskTypeEntity.image = data.image;
        taskTypeEntity.name = data.name;
        BOOL result = [content save:nil];
        if (result) {
           NSLog(@“儲存成功");
        }else{
            NSLog(@"儲存失敗");
        }
    }
   儲存資料成功之後,在個人資訊顯示頁面重複上述步驟查詢之後直接更新資料。 
 
 
5 在 Coredata中如何判斷資料庫是否存在,(不做增刪改查來判斷表是否存在)。
 
判斷一下路徑是否存在,使用NSfileManager
 
1、資料持久化儲存方式有哪些
四種儲存方式: 1.NSUserDefaults,用於儲存配置資訊2.SQLite,用於儲存查詢需求較多的資料3.CoreData,用於規劃應用中 的物件4.使用基本物件型別定製的個性化快取方案.
NSUserDefaults:物件中儲存了系統中使用者的配置資訊,開發者可以通過這個例項物件對這些已有的資訊進行修改,也 可以按照自己的需求建立新的配置項。
 SQLite擅長處理的資料型別其實與NSUserDefaults差不多,也是基礎型別的小資料,只是從組織形式上不同。開發者可 以以關係型資料庫的方式組織資料,使用SQL DML來管理資料。一般來說應用中的格式化的文字類資料可以存放在資料庫 中,尤其是類似聊天記錄、Timeline等這些具有條件查詢和排序需求的資料。
CoreData是一個管理方案,它的持久化可以通過SQLite、XML或二進位制檔案儲存。它可以把整個應用中的物件建模並進 行自動化的管理。從歸檔檔案還原模型時CoreData並不是一次性把整個模型中的所有資料都載入記憶體,而是根據執行時狀 態,把被呼叫到的物件例項載入記憶體。框架會自動控制這個過程,從而達到控制記憶體消耗,避免浪費。 無論從設計原理還是使用方法上看,CoreData都比較複雜。因此,如果僅僅是考慮快取資料這個需求,CoreData絕對不 是一個優選方案。CoreData的使用場景在於:整個應用使用CoreData規劃,把應用內的資料通過CoreData建模,完全 基於CoreData架構應用。
 使用基本物件型別定製的個性化快取方案:從需求出發分析快取資料有哪些要求:按Key查詢,快速讀取,寫入不影響正常 操作,不浪費記憶體,支援歸檔。這些都是基本需求,那麼再進一步或許還需要固定快取項數量,支援佇列快取,快取過期 等。
 
10)本地收藏功能,收藏的內容如果變了,使用者手機顯示的收藏內容也跟著變,怎麼實現
 
解析資料後  判斷收藏的內容 與 新的資料 是否相同  如果不一樣,說明資料已經改變,這時候更新資料
 
6、無網情況下,從本地資料庫sqlite上拉載入時,每次取10條,如何實現?
判斷網路情況,在無網路情況下,上拉載入的時候,通過謂詞設定從資料庫中取出資料10條資料,重新整理介面。
 
5.用coredata的時候,如果使用者更新個人資訊了,怎麼用程式碼來更新頁面上顯示的個人資訊
 
(1)當使用者更新了自己的使用者資訊,儲存更新資料到資料庫
(2)當使用者返回更新頁面時先查詢資料庫中的內容,顯示到頁面上就可以。
查詢資料庫的程式碼:
// 建立請求
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// 建立實體描述
    NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:content];
    [request setEntity:entity];
    [request setReturnsObjectsAsFaults:NO];
// 設定謂詞
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self = %@", data];
    [request setPredicate:predicate];
// 執行請求
    NSArray *dataArray = [content executeFetchRequest:request error:nil];
 
 
// 修改資訊
    if ([dataArray count] > 0) {
        TaskTypeEntity *taskTypeEntity = [dataArray objectAtIndex:0];
        taskTypeEntity.color = data.color;
        taskTypeEntity.status = data.status;
        taskTypeEntity.image = data.image;
        taskTypeEntity.name = data.name;
        BOOL result = [content save:nil];
        if (result) {
           NSLog(@“儲存成功");
        }else{
            NSLog(@"儲存失敗");
        }
    }
   儲存資料成功之後,在個人資訊顯示頁面重複上述步驟查詢之後直接更新資料。
 
13、資料庫增、刪、改、查語句書寫
insert 、 delete 、 update 、 select 增刪改查的關鍵字
1. insert into table name (data type fieldname,data type fieldname...)values (value1,value2.....);
2. delete from table name where id = 23;
3. update table name set 欄位名 = 新值;
4. select * from 表名 where id = 2;
 
39.SQL語句問題:inner join、left join、right join的區別是什麼?
 
left/ right join 是外部連結,inner join 是內連線
外部連結有主表和從表,主表在left中是左側表,right中是右側表,主表資料會全部顯示,從表資料只顯示關聯部分匹配資料,無匹配的資料用null補全。內連線則只顯示兩表關聯條件匹配的資料
注:所謂關聯條件即是指on 的條件
 
40.sqlite的優化。
資料庫在使用的時候一定要與多執行緒相結合的。專案中用到了資料庫,假如其中一個表有33萬條資料。對這個表進行查詢,執行類似“SELECT * FROM table1 where ds_key like 'asd%%'”這樣的語句,在Touch上用了大概11秒,體驗很差。
調查發現,雖然已經對table1增加了索引,但是在實際執行的時候,如果查詢條件包含LIKE,就不會使用索引。
想知道查詢是不是用了索引,可以參考http://www.sqlite.org/eqp.html這個連結提供的方法進行驗證。
而改成“SELECT * FROM table1 where ds_key >= 'asd' and ds_key < 'ase'”這樣的語句,查詢時就會使用到索引,花費時間只有零點幾秒,效率提高了幾十倍。
當然,這隻針對查詢以某個字串開頭的記錄的情況,而對於like '%%asd%%'這樣的就沒法優化了。
103.不同版本的APP,資料庫結構變化了,如何處理?(資料庫遷移)
資料庫遷移問題,一般專案中使用資料框架有兩種Sqlite和CoreData。
在Sqlite中有Alter命令修改資料庫的結構和庫名。
//對於老使用者,資料庫已經存在,需要修改
1.查詢舊錶NSString *searchSql = [NSString stringWithFormat:@"select sql from sqlite_master where tbl_name='表名' and type='table'"];
2.若找到舊錶,判斷是否儲存記錄,新增新欄位或改名
 NSString *sql_add = "ALTER TABLE 表名 ADD 欄位名  欄位型別”;
或者修改表名
ALTER TABLE 原表名 RENAME TO 新表名;
3.執行改sqlite3_exec(資料庫, sql_add, NULL, NULL, NULL)!=SQLITE_OK。
4.釋放伴隨指標。
64.同一個工程中ARC和非ARC 的如何混合使用?
點選專案->TARGETS->Build Phases->Compile  Sources中選擇要改的.m,雙擊,在標籤中新增:
1.如果是ARC專案,要加入非ARC的程式碼檔案:-fobjc-arc
2.如果是非ARC,要加入ARC的程式碼:-fno-objc-arc
回車
 
 
第二十題:coredataNSPersistentStoreCoordinatorNSManagedObjectContextNSManaged哪些需要線上程中建立或者傳遞?你是用什麼樣的策略來實現的?
 
在多執行緒環境中使用CoreData
 
2.多表資料庫操作;
資料庫中多表的之間根據某些欄位建立關聯,多表之間的關係包括一對一,一對多,多對多,進行增刪改查具體的操作需要去寫sql語句。
coreData中多表的操作可以檢視這個部落格中的內容

相關文章