SQLite3

創建、打開、關閉數據庫

- 創建或打開數據庫

// path為:~/Documents/person.db

sqlite3 *db;

int result = sqlite3_open([path UTF8String], &db);

?代碼解析:

?sqlite3_open()將根據文件路徑打開數據庫,如果不存在,則會創建一個新的數據庫。如果result等于常量SQLITE_OK,則表示成功打開數據庫

sqlite3 *db:一個打開的數據庫實例

數據庫文件的路徑必須以C字符串(而非NSString)傳入

#執行不返回數據的SQL語句

- 執行創表語句

char *errorMsg;? // 用來存儲錯誤信息

char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";

int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);

代碼解析:

sqlite3_exec()可以執行任何SQL語句,比如創表、更新、插入和刪除操作。但是一般不用它執行查詢語句,因為它不會返回查詢到的數據

sqlite3_exec()還可以執行的語句:

開啟事務:begin transaction;

回滾事務:rollback;

提交事務:commit;

帶占位符插入數據

char *sql = "insert into t_person(name, age) values(?, ?);";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

sqlite3_bind_text(stmt, 1, "母雞", -1, NULL);

sqlite3_bind_int(stmt, 2, 27);

}

if (sqlite3_step(stmt) != SQLITE_DONE) {

NSLog(@"插入數據錯誤");

}

sqlite3_finalize(stmt);

代碼解析:

- sqlite3_prepare_v2()返回值等于SQLITE_OK,說明SQL語句已經準備成功,沒有語法問題

- sqlite3_bind_text():大部分綁定函數都只有3個參數

- 第1個參數是sqlite3_stmt *類型

- 第2個參數指占位符的位置,第一個占位符的位置是1,不是0

-? 第3個參數指占位符要綁定的值

- 第4個參數指在第3個參數中所傳遞數據的長度,對于C字符串,可以傳遞-1代替字符串的長度

- 第5個參數是一個可選的函數回調,一般用于在語句執行后完成內存清理工作

- sqlite_step():執行SQL語句,返回SQLITE_DONE代表成功執行完畢

- sqlite_finalize():銷毀sqlite3_stmt *對象

查詢數據

char *sql = "select id,name,age from t_person;";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

while (sqlite3_step(stmt) == SQLITE_ROW) {

int _id = sqlite3_column_int(stmt, 0);

char *_name = (char *)sqlite3_column_text(stmt, 1);

NSString *name = [NSString stringWithUTF8String:_name];

int _age = sqlite3_column_int(stmt, 2);

NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);

}

}

sqlite3_finalize(stmt);

- 代碼解析

- sqlite3_step()返回SQLITE_ROW代表遍歷到一條新記錄

- sqlite3_column_*()用于獲取每個字段對應的值,

Core Data


模型文件


NSManagedObject


Core Data主要對象


搭建Core Data上下文環境

// 從應用程序包中加載模型文件

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

// 傳入模型,初始化NSPersistentStoreCoordinator

NSPersistentStoreCoordinator *psc = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model] autorelease];

// 構建SQLite文件路徑

NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"person.data"]];

// 添加持久化存儲庫,這里使用SQLite作為存儲庫

NSError *error = nil;

NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];

if (store == nil) { // 直接拋異常

[NSException raise:@"添加數據庫錯誤" format:@"%@", [error localizedDescription]];

}

// 初始化上下文,設置persistentStoreCoordinator屬性

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];

context.persistentStoreCoordinator = psc;

// 用完之后,還是要[context release];

添加數據

// 傳入上下文,創建一個Person實體對象

NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];

// 設置簡單屬性

[person setValue:@"MJ" forKey:@"name"];

[person setValue:[NSNumber numberWithInt:27] forKey:@"age"];

// 傳入上下文,創建一個Card實體對象

NSManagedObject *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];

[card setValue:@"4414241933432" forKey:@"no"];

// 設置Person和Card之間的關聯關系

[person setValue:card forKey:@"card"];

// 利用上下文對象,將數據同步到持久化存儲庫

NSError *error = nil;

BOOL success = [context save:&error];

if (!success) {

[NSException raise:@"訪問數據庫錯誤" format:@"%@", [error localizedDescription]];

}

// 如果是想做更新操作:只要在更改了實體對象的屬性后調用[context save:&error],就能將更改的數據同步到數據庫

查詢數據

// 初始化一個查詢請求

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

// 設置要查詢的實體

NSEntityDescription *desc = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];

// 設置排序(按照age降序)

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];

request.sortDescriptors = [NSArray arrayWithObject:sort];

// 設置條件過濾(name like '%Itcast-1%')

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*Itcast-1*"];

request.predicate = predicate;

// 執行請求

NSError *error = nil;

NSArray *objs = [context executeFetchRequest:request error:&error];

if (error) {

[NSException raise:@"查詢錯誤" format:@"%@", [error localizedDescription]];

}

// 遍歷數據

for (NSManagedObject *obj in objs) {

NSLog(@"name=%@", [obj valueForKey:@"name"]

}

刪除數據

// 傳入需要刪除的實體對象

[context deleteObject:managedObject];

//將結果同步到數據庫

NSError *error = nil;

[context save:&error];

if (error) {

[NSException raise:@"刪除錯誤" format:@"%@", [error localizedDescription]];

}

打開Core Data的SQL日志輸出開關


Core Data的延遲加載

- Core Data不會根據實體中的關聯關系立即獲取相應的關聯對象

- 比如通過Core Data取出Person實體時,并不會立即查詢相關聯的Card實體;當應用真的需要使用Card時,才會查詢數據庫,加載Card實體的信息

創建NSManagedObject的子類


// 那么生成一個Person實體對象就應該這樣寫

Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];

person.name = @"MJ";

person.age = [NSNumber numberWithInt:27];

Card *card = [NSEntityDescription insertNewObjectForEntityForName:@”Card" inManagedObjectContext:context];

card.no = @”4414245465656";

person.card = card;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容