日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“

發布時間:2023/12/8 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們的生活態度就應該是 “不抱怨” !



其實我想寫這篇文章很久了,因為自己做的iOS開發 ,對數據這一塊有這極高的要求.所以一些必須的存儲數據的使用,我們都有必要熟悉用法.在以前我的簡書中我也是寫過數據持久化,但是我覺得那一篇是不夠完整的,所有我把"增刪改查"這個話題單獨拿出來說一下. 今天主要說4個方面的增刪改查,分別是數組,字典,SQLite數據庫,CoreData數據.

數組


首先說一下數組的增刪改查.數組結構是我們做開發中經常使用的一種結構.然后看一下數組的"增刪改查"是如何進行的吧.當然了,我們要事項說明一點,就是數組分為可變數組,和不可變數組.不可變數組是沒有增刪改查的,所有我們只會對可變數組的增刪改查進行研究.當然了.字典也是一樣的.

//使用便利構造器創建一個可變數組NSMutableArray *mtuArray = [NSMutableArray array];//增//給數組增加一些元素[mtuArray addObject:@"棟哥"];//給數組中添加一個數組[mtuArray addObjectsFromArray:@[@"強哥",@"其弟"]];//改//根據下標修改某個值mtuArray[1] = @"萌神";//查if ([mtuArray containsObject:@"棟哥"]) {NSLog(@"存在棟哥!");}else{NSLog(@"棟哥不知道去哪了?");}//刪//刪除數組某一個元素[mtuArray removeObject:@"棟哥"];//根據下標刪除數組的某一個元素[mtuArray removeObjectAtIndex:1];//刪除所有的元素[mtuArray removeAllObjects];//刪除最后一個元素[mtuArray removeLastObject];

字典


字典是根據鍵值對存儲數據的,當然了字典和數組的"增刪改查"比較類似,不可變字典是沒有"增刪改查"的功能的.只有可變字典存在"增刪改查";那我們看一下字典中的增刪改查是如何進行的

//根據便利構造器創建一個可變字典NSMutableDictionary *dic = [NSMutableDictionary dictionary];//增//添加單個鍵值對[dic setObject:@"棟哥" forKey:@"菜比"];//添加一個不可變字典[dic setDictionary:@{@"大神":@"其弟"}];//刪//刪除某一個鍵值對[dic removeObjectForKey:@"大神"];//刪除字典中的所有元素[dic removeAllObjects];//改//改變某個鍵的值dic[@"菜比"] = @"面面";//查//注意:字典遍歷一遍是在遍歷所有的鍵,我們需要比對鍵的值來查找某個元素for (NSString *key in [dic allKeys]) {if ([dic[key] isEqualToString:@"棟哥"]) {NSLog(@"棟哥存在了!");}else{NSLog(@"棟哥不存在!");}}

SQLite數據庫


SQLite數據庫是iOS內嵌的一個數據庫,合適大型數據的讀寫,主要用于本地一些信息的存儲,SQLite數據庫采用表結構來存儲數據的.我們想在Xcode中使用SQLite數據庫,我們就要先導入我們的庫.

導完了之后,我們首先要有一個Model的模板,這里我就以Student 為類名來創建一個簡單的模板.

我們在Student.h文件中是這樣寫的.

#import <Foundation/Foundation.h>@interface Student : NSObject@property(nonatomic,strong)NSString *name;@property(nonatomic,strong)NSString *gender;@property(nonatomic,assign)int Stu_ID;@property(nonatomic,assign)int age;-(instancetype)initWithName:(NSString *)namegender:(NSString *)genderstuID:(int)stuIDage:(int)age; @end

Student.m是這樣寫的,都是很簡單的

-(instancetype)initWithName:(NSString *)namegender:(NSString *)genderstuID:(int)stuIDage:(int)age{if (self = [super init]) {_age = age;_name = name;_gender = gender;_Stu_ID = stuID;}return self;}-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}- (NSString *)description {return [NSString stringWithFormat:@"%@", _name]; }@end

模板做好了,下面我們就對SQLite 數據做一些調用了,在調動之前,先把一些常用的SQLite語句,也是SQLite數據庫的增刪改查功能

注意 :SQLite語句比較容易出錯,所以我建議大家盡量全都復制黏貼,不要用手敲SQLite 語句!!
//創建表CREATE TABLE "Class43" ("Stu_ID" INTEGER PRIMARY KEY NOT NULL UNIQUE, "name" TEXT NOT NULL, "gender" TEXT NOT NULL DEFAULT M, "age" INTEGER NOT NULL);//添加//方式1(字段和值一一對應(局部添加)) INSERT INTO Class43(Stu_ID,name,gender,age) VALUES (2,'棟哥','男',18)//方式2 (整體賦值)(插入數據的時候需要和表里面的順序一樣) INSERT INTO Class43 VALUES (3,'棟哥','男',17)//修改//方式1整體修改(沒有指定指定關鍵字,則修改全部) UPDATE Class43 SET age = 18//方式2 局部修改 UPDATE Class43 SET age = 18 WHERE name ='騷棟'// 查詢//方式1查詢全部 SELECT * FROM Class43 //方式2 局部查詢 SELECT * FROM Class43 WHERE name = '棟哥'//刪除//方式1 局部變量 DELETE FROM Class43 WHERE Stu_ID = 3//方式2 全局變量 DELETE FROM Class43 //刪除表 DROP TABLE Class43//查找 select * from users order by id limit 1 offset 0offset代表從第幾條記錄“之后“開始查詢,limit表明查詢多少條結果

這里我們創建一個偽單例來存儲我們的SQLite數據庫.

在DataBase.h文件我們做導入sqlite3庫 , 創建單例的方法聲明和增刪改查的方法聲明.

#import <Foundation/Foundation.h>#import <sqlite3.h>@class Student;@interface DataBase : NSObject//創建單例 +(instancetype)shareDataBase;//打開數據庫 -(void)openDB;//關閉數據庫 -(void)closeDB;//添加 -(void)insertStudent:(Student *)student;//刪除 -(void)deleteStudent:(int)studentID;//修改 -(void)upDateStudentWithGender:(NSString *)gender andStuID:(int)stu_id;//查詢全部 -(NSArray <Student *> *)selectAllStudent;//查詢單個學生 -(Student *)selectStudent:(int)Stu_ID;@end

在DataBase.h文件我們對創建單例的方法聲明和增刪改查的方法進行實現.

引入Model文件, 實現單例初始化方法.

#import "DataBase.h"#import "Student.h"@implementation DataBasestatic DataBase *dataBase = nil;+(instancetype)shareDataBase{//加鎖(多線程)@synchronized(self) {if (nil == dataBase) {dataBase = [[DataBase alloc]init];//打開數據庫[dataBase openDB];}}return dataBase;}

現在先把SQL數據庫定義在靜態區.

static sqlite3 *db =nil;

我們不管做增刪改查什么操作,都要先打開數據庫,然后再做對應的操作.

打開數據庫方法解釋 :如果數據庫不為空,我們就不需要重新創建直接返回,當數據庫為空的時候,我們想先找到沙盒對應的路徑,然后創建數據庫,最后在數據庫中創建表格.
//打開數據庫 -(void)openDB{//如果數據庫已經打開,則不需要執行后面的操作if (db != nil) {return;}//創建保存數據庫的路徑NSString *docmsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];docmsPath = [docmsPath stringByAppendingString:@"/LOClass.sqlite"];NSLog(@"%@",docmsPath);//打開數據庫(如果該數據庫存在,則直接打開,否則,會自動創建一個再打開)int result = sqlite3_open([docmsPath UTF8String], &db);if (result == SQLITE_OK) {NSLog(@"數據庫成功打開");//建表//1.準備SQL語句NSString *sql = @"CREATE TABLE Class43 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL);";//2.執行語句sqlite3_exec(db, [sql UTF8String], nil, nil, nil);}else{NSLog(@"%d",result);}}
當我們操作完對應的操作后我們需要關閉數據庫,代碼如下

關閉數據庫方法解釋 : 關閉數據庫的時候,我們需要調用sqlite3_close()方法,然后把我們的數據庫置為nil,這樣數據庫就完全關閉了.

//關閉數據庫 -(void)closeDB{int result = sqlite3_close(db);//關閉數據庫的時候,將db置為空,是因為打開數據庫的時候,我們需要使用nil做判斷.db = nil;if (result == SQLITE_OK) {NSLog(@"數據庫關閉成功!");}else{NSLog(@"數據庫關閉失敗:%d",result);}}
SQL數據庫增加功能
增添方法的解釋: 首先我們需要打開數據庫,然后創建跟隨指針,跟隨指針的作用可以理解為綁定一個完整Model數據到要執行的SQLite語句上,然后再對這個Model進行操作.然后創建SQLite語句并運行,當我們的SQLi特語句執行成功的時候,這時候跟隨指針就綁定Model ,然后單步執行.最后要釋放到跟隨指針.
/添加 -(void)insertStudent:(Student *)student{//1.打開數據庫[self openDB];//2.創建跟隨指針sqlite3_stmt *stmt = nil;//3.準備sql語句NSString *sql =@"INSERT INTO Class43(Stu_ID,name,gender,age) VALUES (?,?,?,?)";//4.驗證sql語句的正確性int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);//5.判斷 并且綁定if (result == SQLITE_OK) {NSLog(@"數據庫添加成功");//一旦sql語句沒有問題就開始綁定數據,替換問號//參數:(1)跟隨指針 (2)問號的順序呢(從1開始) (3)要綁定的值sqlite3_bind_int(stmt, 1, student.Stu_ID);sqlite3_bind_text(stmt, 2, [student.name UTF8String], -1, nil);sqlite3_bind_text(stmt, 3, [student.gender UTF8String], -1, nil);sqlite3_bind_int(stmt, 4, student.age);//6.單步執行sqlite3_step(stmt);}else{NSLog(@"數據庫添加失敗:%d",result);}//釋放跟隨指針占用的內存sqlite3_finalize(stmt);}
SQL數據庫刪除功能
刪除方法的解釋: 首先我們需要打開數據庫,然后創建跟隨指針,然后創建刪除的SQL語句并執行,當執行成功之后,我們就會讓跟隨指針綁定我們的刪除條件,然后單步執行. 執行完成之后,我們需要手動釋放跟隨指針.
//刪除 -(void)deleteStudent:(int)studentID{[self openDB];//創建跟隨指針sqlite3_stmt *stmt = nil;//準備sql語句NSString *sql = @"DELETE FROM Class43 WHERE Stu_ID = ?";//驗證正確與否int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);//開始刪除if (result == SQLITE_OK) {//開始綁定sqlite3_bind_int(stmt, 1, studentID);//單步執行sqlite3_step(stmt);NSLog(@"刪除成功");}else{NSLog(@"刪除失敗");}//釋放sqlite3_finalize(stmt);}
SQL數據庫修改功能
修改方法的解釋: 首先我們需要打開數據庫,然后再創建跟隨指針,創建跟隨指針完成之后,我們需要創建我們的SQL語句并執行,如果執行成功,我們就讓我們的跟隨指針綁定我們的篩選條件,然后單步執行,最后釋放我們的跟隨指針.
//修改 -(void)upDateStudentWithGender:(NSString *)gender andStuID:(int)stu_id{[self openDB];sqlite3_stmt *stmt = nil;NSString *sql = @"UPDATE Class43 SET gender = ? WHERE Stu_ID = ?";int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);if (result == SQLITE_OK) {NSLog(@"修改成功");sqlite3_bind_int(stmt, 2, stu_id);sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, nil);sqlite3_step(stmt);}else{NSLog(@"修改失敗");}//釋放sqlite3_finalize(stmt); }
SQL數據庫查詢整個表格功能
查詢全部方法的解釋:首先打開我們的數據庫,創建跟隨指針,創建完成之后,我們就創建我們的SQL語句并執行.如果執行成功的話,我們就使用while循環反復執行我們的語句,根據sql語句將搜索到的符合條件的值取出來并綁定我們的跟隨指針,然后把查詢到的數據存到數組中,最后不管是否查詢成功,都要釋放我們的跟隨指針.
-(NSArray<Student *> *)selectAllStudent{[self openDB];sqlite3_stmt *stmt = nil;NSString *sql = @"SELECT * FROM Class43";int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);if (result == SQLITE_OK) {NSLog(@"查詢成功!");//創建可變數組用來存放查詢到的學生NSMutableArray *array = [NSMutableArray array];while (sqlite3_step(stmt) == SQLITE_ROW) {//根據sql語句將搜索到的符合條件的值取出來(0 代表數據庫表的第一列);int stu_id = sqlite3_column_int(stmt, 0);NSString *name =[NSString stringWithUTF8String: (const char *)sqlite3_column_text(stmt, 1)];NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];int age = sqlite3_column_int(stmt, 3);//將取出來的信息賦值給學生的modelStudent *student = [[Student alloc]initWithName:name gender:gender stuID:stu_id age:age];[array addObject:student];}sqlite3_finalize(stmt);return array;}else{NSLog(@"查詢失敗!");sqlite3_finalize(stmt);return nil;}}
SQL數據庫查詢單個表格功能
查詢單個方法的解釋:首先打開我們的數據庫,創建跟隨指針,創建完成之后,我們就創建我們的SQL語句并執行.如果執行成功的話,我們就使用while循環反復執行我們的語句,根據sql語句將搜索到的符合條件的值取出來并綁定我們的跟隨指針,然后把查詢到的數據存到對應Model中,最后不管是否查詢成功,都要釋放我們的跟隨指針.
//查詢單個學生 -(Student *)selectStudent:(int)Stu_ID{//打開數據庫[self openDB];//創建跟隨指針sqlite3_stmt *stmt = nil;//準備sql語句NSString *sql = @"SELECT * FROM Class43 WHERE Stu_ID = ?";//驗證int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);if (result == SQLITE_OK) {NSLog(@"查詢成功!");//綁定sqlite3_bind_int(stmt, 1, Stu_ID);Student *stu =[Student new];//執行while (sqlite3_step(stmt) == SQLITE_ROW) {stu.Stu_ID = sqlite3_column_int(stmt, 0);stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];stu.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];stu.age = sqlite3_column_int(stmt, 3);}sqlite3_finalize(stmt);return stu;}else{NSLog(@"查詢失敗:%d",result);sqlite3_finalize(stmt);return nil;}}

CoreData數據庫


相比于SQLite數據庫, CoreData數據庫就先相對的簡單了許多,CoreData的實現原理你可以想象是github的文件管理一樣.你本地是內存,github的服務器是沙盒,你在內存操作完之后就手動傳到沙盒中進行本地化保存.其實 CoreData數據庫是對SQLite數據庫的封裝.而且CoreData支持可視化建模.更是大大減少了我們的代碼量,現在我們就看一下CoreData的實現步驟以及增刪改查功能.

創建工程的時候,我們需要手動添加數據庫

這時候,Xcode會自動幫助我們在AppDelegate里面生成幾個額外的屬性.屬性的解釋如下

//被管理對象上下文,相當于一個臨時數據庫,我們存儲或者查詢都是通過這個對象來進行的. @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;//被管理對象模型,可以簡單的理解為可視化建模文件.我們在可視化建模中是Entity,自動生成Model,就是這個對象.方便讓文件存儲助理進行管理. @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;//文件存儲助理,他是CoreData的核心.他負責連接所有的模塊,包括真實的存儲文件. @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;//將我們在內存中的操作進行持久化. - (void)saveContext; //獲取真實文件的路徑. - (NSURL *)applicationDocumentsDirectory;

這里我對上面的Core做了一些簡單的總結

/*1.CoreData 是蘋果公司封裝的數據持久化框架.在iOS3.0中開始開放.2.它允許用戶按照實體-屬性-值模型組織數據,并以二進制,XML,或者sqlite數據文件的格式進行持久化.CoreData的優勢1.他是蘋果公司原生態的產品.2.他可以節省代碼量,大概是30%~70%.3.它支持可視化建模.4.CoreData 支持數據庫版本升級.可以通過Editor下的菜單進行生成模型,將Entity生成Model.在其過程中有一個選項,勾選,生成的是標量,不勾選,生成的是通量.*/

相對于SQLite中的代碼建模,CoreData更加簡潔.

如圖添加一個Model

點擊 Create 生成一個Model

選擇生成的路徑和生成的Model ,最后我們需要做標量和通量的選擇.

在說"增刪改查"之前,我要說一個代碼塊 ,這個代碼塊的輸入代碼是 *** fetch - Core Data Fetch*** 代碼塊如下,這就是我們要從沙盒中搬到內存的數據,當然了,我們需要做一些謂詞篩選等,下面的增刪改查中會用到.查詢到的結果就在fetchedObjects這個數組中存儲著.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:<#context#>];[fetchRequest setEntity:entity];// Specify criteria for filtering which objects to fetchNSPredicate *predicate = [NSPredicate predicateWithFormat:@"<#format string#>", <#arguments#>];[fetchRequest setPredicate:predicate];// Specify how the fetched objects should be sortedNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#key#>"ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];NSError *error = nil;NSArray *fetchedObjects = [<#context#> executeFetchRequest:fetchRequest error:&error];if (fetchedObjects == nil) {<#Error handling code#>}

我是在ViewController做一些"增刪改查"的操作,首先我們需要聲明兩個屬性,一個是聯系上下文的對象是一個用于保存數據的數組,首先,我們會在ViewDidLoad進行初始化一下.

#import "ViewController.h"#import "AppDelegate.h"#import "Student.h"@interface ViewController ()//創建一個上下文對象,用于處理所有與存儲相關的請求. @property(nonatomic,strong)NSManagedObjectContext *myContext;//創建一個數組,用于存儲數組的數據源. @property(nonatomic,strong)NSMutableArray *allData;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];//進行數據初始化self.allData = [ NSMutableArray array];AppDelegate *dele = [UIApplication sharedApplication].delegate;self.myContext = dele.managedObjectContext;}
CoreData數據庫增添功能

數據庫增添功能方法解釋: 首先我們需要創建一個實體描述對象然后存到聯系上下文對象中,給這個實體描述對象進行賦值. 再由NSManagedObjectContext對象進行本地化存儲.

-(void)addObject{//1.創建Student對象//創建一個實體描述對象NSEntityDescription *description = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];Student *stu = [[Student alloc]initWithEntity:description insertIntoManagedObjectContext:self.myContext];//給屬性賦值stu.name = @"張三";stu.age = arc4random()%73+1;[self.allData addObject:stu];//本地化保存AppDelegate *dele = [UIApplication sharedApplication].delegate;[dele saveContext];}
CoreData數據庫刪除功能

數據庫刪除功能方法解釋: 刪除只需要我們把本地的myContext對象中的實體化對象刪除掉,然后再保存就行.

-(void)deleteObject{//獲取當前代表的數據Student *stu = self.allData[1];//將臨時數據庫進行刪除并進行本地持久化[self.myContext deleteObject:stu];[self.myContext save:nil];}
CoreData數據庫修改功能

數據庫修改功能方法解釋: 首先我們需要把沙盒中的數據表格更新到我們的內存對象myContext中去,然后修改實例化對象的值,然后保存到數組,中,最后在進行數據持久化操作.

-(void)upDataObject{//先查詢NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];[fetchRequest setEntity:entity];// Specify criteria for filtering which objects to fetch// how the fetched objects should be sortedNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age"ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];NSError *error = nil;NSArray *fetchedObjects = [self.myContext executeFetchRequest:fetchRequest error:&error];if (fetchedObjects == nil) {}//修改對對應的數據Student *stu = self.allData[1];stu.name = @"尼古拉斯-趙四";//更新數據源[self.allData removeAllObjects];[self.allData addObjectsFromArray:fetchedObjects];//將修改本地持久化[self.myContext save:nil];}
CoreData數據庫查詢功能

數據庫查詢功能方法解釋: 這里只做整體的查詢,當我們需要查詢某個數據的時候,我們就要先從山河中下載到內存中,然后保存到我們的數組中.在對數組進行遍歷操作,查詢我們的對象.

-(void)selectAllData{NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];[fetchRequest setEntity:entity];// Specify criteria for filtering which objects to fetch// Specify how the fetched objects should be sorted//排序條件NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age"ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];NSError *error = nil;NSArray *fetchedObjects = [self.myContext executeFetchRequest:fetchRequest error:&error];if (fetchedObjects == nil) {NSLog(@"兩手空空,你讓我拿什么飛天?");}//將查詢到的數據添加到數據源[self.allData addObjectsFromArray:fetchedObjects];}

作為"增刪改查"這四個操作,是我們程序員對數據最基本的操作,希望大家能夠喜歡這篇,如果喜歡就點個贊唄 😃

總結

以上是生活随笔為你收集整理的华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 操久久久 | 少妇激情网| 色999视频| 最近免费中文字幕 | 一区二区三区四区人妻 | 国产福利99 | 欧美一区网站 | 精品一区二区三区蜜臀 | 色哟哟免费在线观看 | 一区二区高潮 | 性高潮久久久久久 | 一级黄色播放 | av色欲无码人妻中文字幕 | 操久久久| 欧美一区二区三区黄片 | 国产第56页 | 国产三级理论 | 国产高清自拍一区 | a级片免费视频 | 91视频h | 欧美乱码精品一区二区三区 | a资源在线| 国产精品美女网站 | 亚洲一区二区免费电影 | 精品一区二区三区蜜桃 | 欧美乱码精品一区二区三区 | 免费成人深夜夜行网站视频 | 巨大胸大乳奶电影 | 婷婷国产一区 | 岛国av噜噜噜久久久狠狠av | 亚洲精品女人 | 人妖一区二区三区 | 精品久久人妻av中文字幕 | 久久高潮视频 | 亚洲激情a | 美女视频在线免费观看 | av福利在线免费观看 | 国产特级aaaaaa大片 | 国产精品成人一区二区三区 | 亚洲精品一区二区三区四区 | 色屁屁视频| 国产在线视频在线观看 | 在线观看亚洲av每日更新 | 精品视频无码一区二区三区 | 亚洲第一色网站 | 亚洲欧美精品suv | 朝桐光一区二区 | 天堂va在线 | 亚洲涩综合 | 91视频 - 88av| 国产日产久久高清欧美一区 | 婷久久| 一区二区三区蜜桃 | 最新av在线网站 | 91视频在线看 | 天天艹 | 日韩av三区| 国模一区二区三区 | 粗大的内捧猛烈进出视频 | 黄色喷水网站 | 日本变态折磨凌虐bdsm在线 | 伊人焦久影院 | 亚洲区av | 久草网在线视频 | 极品少妇在线观看 | 91成人短视频在线观看 | 538精品一线| 黄色片免费在线播放 | 澳门超碰| 日本三级免费看 | 久久久久亚洲AV成人 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 国产乱来 | 日本亚洲欧美 | 久久精品五月天 | 热热热av | 99一区二区三区 | 99精品久久久久久久 | 综合久久色 | av一级黄色片 | 成年女人免费视频 | www天堂在线 | 国产精品一卡二卡三卡 | 国内精品在线观看视频 | 久久精品视频在线免费观看 | 日韩xx视频| 国产精品成人午夜视频 | 日韩精品在线免费观看视频 | 成人av网址在线 | 欧美激情网址 | 爆操白虎| 波多野结衣福利 | 黄片一区二区 | 黄污视频在线观看 | 亚洲精品合集 | 天天摸日日摸狠狠添 | 婷婷伊人综合中文字幕 | 激情婷婷六月 | 日韩在线视频网站 |