數據持久化,好高端~哎,數據庫啊!!

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中多表的操作可以查看這個博客中的內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章