欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

每天學習一個Android中的常用框架——1.Litepal

2020-4-8    seo達人

文章目錄

1.簡介

2.特性

3.演示

3.1 集成

3.2 配置

3.3 創(chuàng)建數據庫

3.4 升級數據庫

3.5 插入數據

3.6 查詢數據

3.7 更新數據

3.8 刪除數據

4.版本異同

5.源碼地址

1.簡介

Litepal——作為帶我入行的第一本教學書籍《Android第一行代碼》的作者郭霖老師所寫出來的持久化框架,幾乎算是我接觸Android世界之后第一個遇到的框架,故將該框架列為一系列學習框架博客的首位。

根據Litepal的GitHub主頁:Litepal,可以看到該框架的一些簡介:



LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most of the database operations without writing even a SQL statement, including create or upgrade tables, crud operations, aggregate functions, etc. The setup of LitePal is quite simple as well, you can integrate it into your project in less than 5 minutes.



事實上,正如這段簡介所說,集成Litepal相當簡單,不需要超過五分鐘時間。使用Litepal,也適合對sql語言還不熟悉的開發(fā)者快速上手。



2.特性

讓我們繼續(xù)瀏覽Litepal的GitHub主頁,可以發(fā)掘Litepal的一些特性:



Using object-relational mapping (ORM) pattern.

Almost zero-configuration(only one configuration file with few properties).

Maintains all tables automatically(e.g. create, alter or drop tables).

Multi databases supported.

Encapsulated APIs for avoiding writing SQL statements.

Awesome fluent query API.

Alternative choice to use SQL still, but easier and better APIs than the originals.

More for you to explore.

用大白話來描述的話,可以列舉如下:



Litepal使用了ORM(對象關系映射)模型

Litepal幾乎是無配置的,僅需極少的配置文件

Litepal幾乎包括所有的CRUD操作,也支持多張表格的操作

Litepal可以僅調用api進行CRUD操作而避免編寫sql語句

總之,看到Litepal具有這么多良好的特性,讀者是否心動了呢。理論的話不多說,我們現在就開始正式地使用Litepal進行數據庫的相關操作

PS:如果有曾經學習過Java的ORM框架——Mybatis的讀者,應該不會對Litepal的使用太陌生,因為它們都使用了xml文件進行相應的配置



3.演示

3.1 集成

現在Android框架的集成相比于IDE還為ADT的時代,要方便了許多。原因是現在的主流IDE是Android Studio,而AS默認使用了Gradle進行版本的配置管理,這讓集成框架變得簡單了許多。

在build.gradle下,添加以下語句,然后重新sync,即可將Litepal集成到你的項目中:



implementation 'org.litepal.android:java:3.0.0'

1

當然,目前Android的主流開發(fā)語言,除了Java之外,還有Kotlin,Litepal同樣具有Kotlin版本的(這里的演示僅針對Java,Kotlin版本的異曲同工)依賴:



implementation 'org.litepal.android:kotlin:3.0.0'

1

可以根據個人需求進行配置。



3.2 配置

集成了Litepal之后,要想正式使用它還需要進行一些配置



在assets目錄下新建litepal.xml,作為Litepal的全局配置文件,相應的條目信息已作出注釋,代碼如下:

<?xml version="1.0" encoding="utf-8"?>

<litepal>

    <!--  數據庫名  -->

    <dbname value="androidframelearn"/>



    <!--  數據庫版本號  -->

    <version value="1"/>



    <!--  指定映射模型  -->

    <list>

       

    </list>



    <!--  指定文件的存儲方式  -->

    <!--  <storage value="external" />-->

</litepal>



在你的應用下配置Litepal,有兩種方式可以實現:

修改清單文件,將你的應用名修改為:android:name="org.litepal.LitePalApplication"

新建一個自己寫的MyOwnApplication類,然后將清單文件中的應用名定位到該類,即:android:name="com.example.MyOwnApplication",然后再編寫MyOwnApplication類,代碼如下:

public class MyOwnApplication extends Application {



@Override

public void onCreate() {

    super.onCreate();

    LitePal.initialize(this);

}

...

}



兩種方式亦可,Litepal的作者建議若使用第二種方式,需要盡快地調用LitePal.initialize(this);所以將其放在onCreate()方法是最好的。



3.3 創(chuàng)建數據庫

剛才在介紹的時候已經說過,Litepal采取的是對象關系映射(ORM)的模式,那么什么是對象關系映射呢?簡單點說,我們使用的編程語言是面向對象語言,而使用的數據庫則是關系型數據庫,那么將面向對象的語言和面向關系的數據庫之間建立一種映射關系,這就是對象關系映射了。

不過你可千萬不要小看對象關系映射模式,它賦予了我們一個強大的功能,就是可以用面向對象的思維來操作數據庫,而不用再和SQL語句打交道了,不信的話我們現在就來體驗一下。像往常使用SQLiteOpenHelper類,為了創(chuàng)建一張Book表需要先分析表中應該包含哪些列,然后再編寫出一條建表語句,最后在自定義的SQLiteOpenHelper中去執(zhí)行這條建表語句。但是使用LitePal,你就可以用面向對象的思維來實現同樣的功能了,定義一個Book類,代碼如下所示:



package com.androidframelearn.dao_litapal;



import org.litepal.crud.LitePalSupport;



public class Book extends LitePalSupport {

    private int id;

    private String author;

    private double price;

    private int pages;

    private String name;

    public int getId(){

        return id;

    }

    public void setId(int id){

        this.id = id;

    }



    public String getAuthor(){

        return author;

    }

    public void setauthor(String author){

        this.author = author;

    }



    public double getPrice(){

        return price;

    }

    public void setPrice(double price){

        this.price = price;

    }



    public int getPages(){

        return pages;

    }

    public void setPages(int pages){

        this.pages = pages;

    }



    public String getName(){

        return name;

    }

    public void setName(String name){

        this.name = name;

    }

}



這里使用標簽來聲明我們要配置的映射模型類,注意一定要使用完整的類名。不管有多少模型類需要映射,都使用同樣的方式配置在標簽下即可。

沒錯,這樣就已經把所有工作都完成了,現在只要進行任意一次數據庫的操作,BookStore.db數據庫應該就會自動創(chuàng)建出來。為了更好地演示代碼,我們將布局文件所需要的功能一次性編寫好,activity_main.xml代碼如下:



<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity"

    android:orientation="vertical">



    <Button

        android:id="@+id/btn_db_create"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="創(chuàng)建數據庫"/>



    <Button

        android:id="@+id/btn_db_query"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="查詢數據"/>



    <Button

        android:id="@+id/btn_db_insert"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="插入數據"/>



    <Button

        android:id="@+id/btn_db_update"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="更新數據"/>



    <Button

        android:id="@+id/btn_db_delete"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="刪除數據"/>



</LinearLayout>





接下來,修改MainActivity,除了給按鈕注冊點擊事件,還需要編寫不同的方法代表不同的邏輯,其中,創(chuàng)建數據庫的方法代碼如下:



private void createDBbyLitePal() {

        btn_db_create.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Log.i(TAG,"創(chuàng)建數據庫成功");

                LitePal.getDatabase();

            }

        });

    }



僅僅通過點擊按鈕,調用LitePal.getDatabase();這句api,就可以創(chuàng)建出數據庫,讓我們實際進入項目中嘗試一下吧!點擊該按鈕,然后查看控制臺,如圖所示:



出現該句日記,說明數據庫創(chuàng)建成功,接下來我們看看這個數據庫是否按照我們所設置好的格式創(chuàng)建出來了,進入data/data/你的項目包名/databases,即可查看到該數據庫已經放置到該目錄下,如圖所示:





3.4 升級數據庫

事實上,若想對現有數據庫進行升級,也是可以實現的。以前我們使用SQLiteOpenHelper來升級數據庫的方式,雖說功能是實現了,但你有沒有發(fā)現一個問題,,就是升級數據庫的時候我們需要先把之前的表drop掉,然后再重新創(chuàng)建才行。這其實是一個非常嚴重的問題,因為這樣會造成數據丟失,每當升級一次數據庫,之前表中的數據就全沒了。

而使用Litepal,就可以很好地避免這個問題。假設我們現在有一張新的表Category要加進去,同樣編寫它的實體類,代碼如下:



package com.androidframelearn.dao_litapal;



public class Category {

    private int id;

    private String categoryName;

    private int categoryCode;

    public int getId(){

        return id;

    }

    public void setId(int id){

        this.id = id;

    }



    public String getCategoryName(){

        return categoryName;

    }

    public void setCategoryName(String categoryName){

        this.categoryName = categoryName;

    }



    public int getCategoryCode(){

        return categoryCode;

    }

    public void setCategoryCode(int categoryCode){

        this.categoryCode = categoryCode;

    }

}



改完了所有我們想改的東西,只需要記得在litepal.xml將版本號加1就行了。當然由于這里還添加了一個新的模型類,因此也需要將它添加到映射模型列表中。修改litepal.xml中的代碼,如下所示:



<?xml version="1.0" encoding="utf-8"?>

<litepal>

    <!--  數據庫名  -->

    <dbname value="androidframelearn"/>



    <!--  數據庫版本號  -->

    <version value="2"/>



    <!--  指定映射模型  -->

    <list>

        <mapping class="com.androidframelearn.dao_litapal.Book"/>

        <mapping class="com.androidframelearn.dao_litapal.Category"/>

    </list>



    <!--  指定文件的存儲方式  -->

    <!--  <storage value="external" />-->

</litepal>



重新運行一下程序,再次創(chuàng)建數據庫,就可以完美地完成數據庫的升級了。這里的調試可以使用sqlite工具,這里不再贅述。



3.5 插入數據

在講述本節(jié)時,首先回顧一下之前添加數據的方法,我們需要創(chuàng)建出一個Contentvalues對象,然后將所有要添加的數據put到這個Contentvalues對象當中,最后再調用SQLiteDatabase的insert() 方法將數據添加到數據庫表當中,步驟相當繁瑣。

而使用LitePal來添加數據,這些操作可以簡單到讓你驚嘆!我們只需要創(chuàng)建出模型類的實例,再將所有要存儲的數據設置好,最后調用一下save()方法就可以了。

同樣地,修改MainActivity,增加插入數據的事件方法,代碼如下:



private void insertDatabyLitePal() {

        btn_db_insert.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Book book = new Book();

                book.setName("The Da Vinci Code");

                book.setauthor("Dan Brown");

                book.setPages(454);

                book.setPrice(16.96);

                book.save();

                Log.i(TAG,"插入數據成功");

            }

        });

    }



同樣運行程序,查看控制臺,如圖所示:



當點擊查詢數據(下一節(jié)將介紹該邏輯)時,控制臺打印剛剛插入的數據,如圖所示:





3.6 查詢數據

使用Litepal同樣可以很輕易地查詢數據,當然了,由于篇幅限制,這里僅僅貼出最簡單的查詢方式,至于關聯查詢等稍復雜的查詢方式,可以去GItHub上參考Litepal的官方文檔進行相關調用即可。

同樣地,修改MainActivity,增加查看數據的事件方法,代碼如下:



private void queryDatabyLitePal() {

        btn_db_query.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                List<Book> books = LitePal.findAll(Book.class);

                for (Book book : books){

                    Log.i(TAG,"查詢數據成功");

                    Log.d("MainActivity","書名是"+book.getName());

                    Log.d("MainActivity","書的作者是"+book.getAuthor());

                    Log.d("MainActivity","書的頁數是"+book.getPages());

                    Log.d("MainActivity","書的價格是"+book.getPrice());

                }

            }

        });

    }



相關的運行結果上一小節(jié)以貼出,這里不再重復。



3.7 更新數據

更新數據要比添加數據稍微復雜一點,因為它的API接口比較多,這里我們只介紹最常用的幾種更新方式。

首先,最簡單的一種更新方式就是對已存儲的對象重新設值,然后重新調用save()方法即可。那么這里我們就要了解一個概念,什么是已存儲的對象?

對于LitePal來說,對象是否已存儲就是根據調用model.isSaved()方法的結果來判斷的, 返回true就表示已存儲,返回false就表示未存儲。那么接下來的問題就是,什么情況下會返回true,什么情況下會返回false呢?

實際上只有在兩種情況下model.isSave()方法才會返回true, 一種情況是已經調用過model. save()方法去添加數據了,此時model會被認為是已存儲的對象。另一種情況是model對象是通過LitePal提供的查詢API查岀來的,由于是從數據庫中查到的對象,因此也會被認為是已存儲的對象。

由于查詢API相對復雜,因此只能先通過第一種情況來進行驗證。修改MainActivity中的代碼,如下所示:



private void updateDatabyLitePal() {

        btn_db_update.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Book book = new Book();

                book.setName("The Lost Symbol");

                book.setauthor("Dan Brown");

                book.setPages(510);

                book.setPrice(19.95); // 第一次設置商品價格

                book.save();

                book.setPrice(10.99); // 第二次設置商品價格

                book.save();

                Log.i(TAG,"更新數據成功");

            }

        });

    }



可以看到,我們做了跟插入數據類似的事情,但是我們對數據的價格進行了設置,運行程序,如圖所示:



可以看到,除了剛剛插入的數據,還有第二條剛剛更新過后的數據。然而這種更新方式只能對已存儲的對象進行操作,限制性比較大,接下來我們學習另外一種更加靈巧的更新方式,可以調用以下api:



book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");

1

這里僅貼出其中一條api,其他的可以參考官方文檔,這里不再贅述。



3.8 刪除數據

使用Litepal刪除數據的方式主要有兩種,第一種比較簡單,就是直接調用已存儲對象的delete()方法就可以了,對于已存儲對象的概念,我們在之前已經學習過了。也就是說,調用過save()方法的對象,或者是通過LitePal提供的查詢API查出來的對象,都是可以直接使用delete()方法來刪除數據的。這種方式比較簡單,我們就不進行代碼演示了,下面直接來看另外一種刪除數據的方式。

代碼如下:



private void deleteDatabyLitePal() {

        btn_db_delete.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                LitePal.deleteAll(Book.class,"price < ?","15");

                Log.i(TAG,"刪除成功");

            }

        });

    }



運行程序,刪除過后,按照代碼邏輯,已經刪除掉了所有price小于15的條目,如圖所示:





4.版本異同

之前閱讀了郭霖老師所著《Android第一行代碼 第二版》時,所記載的Litepal版本為:



compile 'org.litepal.android:core:1.4.1'

1

而的Litepal版本(Java版本,另有Kotlin版本,導入的依賴稍有不同)為:



implementation 'org.litepal.android:java:3.0.0'

1

新舊版本的主要區(qū)別是一些類名的劃分,例如老板本的DataSupport變成了LitePalSupport,除此之外,一些api的名稱也稍有變動,讀者在使用時最好可以參考GitHub上的官方文檔,及時更新代碼,做到與時俱進。



5.源碼地址

AFL——Android框架學習


日歷

鏈接

個人資料

藍藍設計的小編 http://www.ocunn.cn

存檔

欧美黄色一级网站| 中文精品在线| 国产黄色精品| 亚洲深夜视频| 国产淫片在线观看| 男同在线观看| 3dmax动漫人物在线看| 国产精品欧美亚洲| 不卡av电影在线| 日韩乱码在线观看| 欧美日韩精品在线观看视频| www.久久av| 亚洲成年人在线观看| 一级淫片在线观看| 国产高潮免费视频| aaaaaa亚洲| 国产中文字幕在线免费观看| 成人午夜视频免费观看| 一区二区三区精品国产| 日韩美女一区| 欧美亚洲免费在线| 另类欧美小说| 久久精品日产第一区二区三区乱码| 国产精品狼人色视频一区| 国产91|九色| 欧美在线日韩在线| 国产97色在线| 国产精品一区二区性色av| 国产精品麻豆va在线播放| 青青久久aⅴ北条麻妃| 欧美亚洲日本网站| 国产精品99久久久久久久久久久久 | 在线三级av| 亚洲色偷精品一区二区三区| 国精产品一品二品国精品69xx| 国产成a人亚洲精v品无码| 精品人妻一区二区三区日产乱码| 精品国产av 无码一区二区三区 | 久久亚洲色图| 日韩av中文在线观看| 亚洲美女少妇无套啪啪呻吟| 国内综合精品午夜久久资源| 亚洲福利一区| 日韩福利电影在线观看| 国产尤物一区二区在线| 国产91精品一区二区麻豆网站| 国产成人啪免费观看软件| 成人国产精品免费观看| 99精品国产一区二区三区不卡| 久久午夜电影网| 中文字幕日韩一区| 婷婷国产在线综合| 欧美私模裸体表演在线观看| 亚洲大胆人体视频| 中文字幕欧美日韩va免费视频| 色悠悠国产精品| 色综合视频网站| 777精品视频| 成人激情视频在线播放| 久草精品电影| 50度灰在线观看| 一级特黄性色生活片| 天天爽夜夜爽视频| 免费看的黄色网| 欧美老熟妇一区二区三区| 国产又爽又黄的视频| 国产美女自慰在线观看| 在线国产一区二区三区| 在线中文字幕电影| 福利一区在线| 欧美综合另类| 亚洲一区二区免费看| 国产乱子伦一区二区三区国色天香| 91性感美女视频| 亚洲精品国久久99热| 欧美丝袜丝交足nylons图片| 亚洲日韩中文字幕| 国产999精品久久久| 精品欧美一区二区三区久久久| www.黄色网址.com| 欧洲在线免费视频| 日韩欧美国产成人精品免费| 综合久久中文字幕| 激情小视频在线| 成人午夜精品无码区| 国产伦精品一区二区三区妓女下载 | 成人h版在线观看| 亚洲老妇xxxxxx| 精品一区二区免费视频| 日韩不卡在线观看日韩不卡视频| 97久久超碰精品国产| 欧美日韩国产在线| 日韩毛片在线观看| 国产精品成人av性教育| 欧日韩一区二区三区| 久久精品影视大全| 黄色录像一级片| 国产免费福利视频| 国产偷拍一区二区| 色哟哟免费在线观看| 成人精品在线播放| 天天操天天干天天干| 欧美巨大xxxx做受沙滩| 成人性生交大片免费看中文视频| 一区二区久久| 国产免费成人在线视频| 91精品国产91综合久久蜜臀| 久久久久久av| 日本一区二区三区四区高清视频| 男女污污的视频| 久草视频手机在线观看| 黑料吃瓜在线观看| 日本在线中文字幕一区二区三区 | 亚洲国产成人91精品| 日产日韩在线亚洲欧美| 亚洲国产精品女人| 亚洲欧美色图视频| 国产剧情久久久| 成人短视频在线观看| 欧美偷窥清纯综合图区| 久久er99精品| 精品免费在线视频| 最近2019好看的中文字幕免费| 99在线视频播放| 午夜视频在线瓜伦| 99精品视频一区| 一本久久a久久精品亚洲| 亚洲人成亚洲人成在线观看| 亚洲精品国产首次亮相| 日本成人中文字幕| 亚洲国产综合色| www.欧美精品一二三区| 鲁丝一区鲁丝二区鲁丝三区| 一级 黄 色 片一| 超碰在线观看91| 超碰porn在线| 99久久激情| 久久久99免费| 日韩精品电影网| 国产高潮国产高潮久久久91 | av动漫在线免费观看| 一级黄色片大全| 天堂在线中文在线| 霍思燕三级露全乳照| 日本黄色特级片| 精品国产九九九| 手机在线观看av网站| 国产精品久免费的黄网站| 三级网站免费观看| 欧美黄色成人| 琪琪一区二区三区| 91黄色在线观看| 欧美性受xxxx黑人猛交| 国产精品无码免费专区午夜| 中文字幕在线观看成人| 69久久久久| 成人激情开心网| 中文字幕国产一区| 日韩在线视频观看正片免费网站| 欧美日韩电影一区二区| 成人免费无遮挡无码黄漫视频| 中文字幕4区| av综合网站| 成人免费视频网站在线观看| 亚洲成人网在线观看| 国产厕所精品在线观看| 亚洲欧美日韩偷拍| 中国一级特黄毛片大片| 欧美三级午夜理伦三级在线观看| 99免费精品在线观看| 亚洲欧美国产精品专区久久| 日韩国产高清一区| 性生交大片免费全黄| 午夜免费播放观看在线视频| 午夜欧美在线| 亚洲v精品v日韩v欧美v专区| 91a在线视频| 亚洲天堂av线| 精品人妻一区二区三区含羞草| 色综合久久久| av不卡在线观看| 中文字幕日韩免费视频| 性生活免费观看视频| 激情五月色婷婷| 欧美大片免费| 国产成人精品午夜视频免费| 亚洲免费电影一区| 精品一区二区成人免费视频 | 97超碰在线资源| 岛国大片在线观看| 国产精品v亚洲精品v日韩精品| 精品久久香蕉国产线看观看亚洲 | 成人毛片视频在线观看| 日韩精品中文字| 中国黄色录像片| 永久免费无码av网站在线观看| 另类专区亚洲| 丰满白嫩尤物一区二区| 中文字幕在线国产精品| 日韩精品 欧美| 国产精品自拍电影| 女一区二区三区| 日韩毛片一二三区| 国产精品www| 玖玖爱在线精品视频| 国产成人天天5g影院在线观看| 亚洲国产一区二区三区高清| 欧美精品久久久久久久久老牛影院 | 隔壁老王国产在线精品| gai在线观看免费高清| 在线观看av网站| 午夜视频精品| 欧美一级生活片| 中文字幕日韩一区二区三区| 夜夜爽妓女8888视频免费观看| 国语精品视频| 亚洲欧美国产三级| 亚洲一区二区三区四区在线播放 | 黄色一级片中国| 色婷婷综合久久久中字幕精品久久| 国产精品系列在线播放| 美女啪啪无遮挡免费久久网站| 久久久久国产一区| 青青草免费在线| 一区二区三区导航| 国产丝袜一区二区三区免费视频| 免费av观看网址| 黄色高清在线观看| 亚洲专区免费| 自拍亚洲一区欧美另类| 欧美成年人视频在线观看| 国产视频三级在线观看播放| √天堂8在线网| 三级电影一区| 欧美久久久影院| 超碰成人免费在线| 在线观看国产麻豆| 日韩高清在线电影| 欧美成人激情在线| 亚洲精品在线视频免费观看| 深夜成人在线| 亚洲欧洲精品成人久久奇米网| 欧美成人一区二区三区片免费 | 亚洲精品久久久久久久久久久久| 男女超爽视频免费播放| 日本在线视频1区| 久久99国产精品久久99| 国内精久久久久久久久久人| 99精品欧美一区二区| 亚洲伦理一区二区| 精品久久久久久久久中文字幕 | 欧美日本国产| 亚洲伦理中文字幕| 四川一级毛毛片| 涩涩涩在线视频| 亚洲欧美日韩在线播放| 欧美成人免费在线| 亚洲精品国产精品乱码不卡| 性色一区二区三区| 国模吧一区二区| 国产高潮国产高潮久久久91| 欧美国产极品| 日韩一区二区精品葵司在线| 一区二区在线播放视频| 3d玉蒲团在线观看| 中文字幕不卡在线| 日本不卡在线观看| 色一情一乱一乱一区91av| 美女视频免费一区| 国产精品福利网站| 日本丰满少妇做爰爽爽| 欧美全黄视频| 欧美伦理91i| 香蕉久久久久久久| 丝袜美腿综合| 精品视频在线播放色网色视频| 少妇极品熟妇人妻无码| 成人a在线观看高清电影| 91极品美女在线| 男人搞女人网站| 碰碰在线视频| 一本大道久久a久久精品综合| 激情小视频网站| 久热国产在线| 悠悠色在线精品| 黄色片免费在线观看视频| 色综合久久影院| 成人免费在线视频观看| 美女黄色片网站| 色综合久久久久综合一本到桃花网| 国产精品麻豆欧美日韩ww| 一区二区日本伦理| 日本高清视频在线观看| 亚洲丝袜美腿综合| 欧美日韩dvd| 女囚岛在线观看| 韩曰欧美视频免费观看| 免费av网址在线| 国产欧美一区二区三区精品酒店| 色诱亚洲精品久久久久久| 日本特黄a级片| 成人在线不卡| 精品国产免费久久| 中文字幕成人动漫| re久久精品视频| 欧美成人免费观看| 五月天综合激情网| 日韩精品久久理论片| 成人精品久久久| 少妇荡乳情欲办公室456视频| 成人在线视频一区二区| 欧美一区免费视频| 午夜毛片在线| 精品国产31久久久久久| 91网址在线播放| av日韩久久| 亚洲全黄一级网站| 欧美色图亚洲视频| 日韩视频精品在线观看| 国产精品视频久久久久| 丰满人妻av一区二区三区| 91蝌蚪porny成人天涯| 免费看啪啪网站| 成年人在线网站| 欧美一级艳片视频免费观看| 亚洲v国产v欧美v久久久久久| 偷拍欧美精品| 欧美一区二区三区图| 亚洲第一页在线观看| 2019国产精品| 国产av麻豆mag剧集| 国产精品久久久久久妇女| 日韩电视剧在线观看免费网站| 欧美成人三级视频| 天堂久久久久va久久久久| 国产一区不卡在线观看| 日本在线免费网| 在线观看av一区二区| 插吧插吧综合网| 欧美日韩1区2区3区| 成人免费网视频| 天堂网www中文在线| 性久久久久久久久久久久| 被黑人猛躁10次高潮视频| 日韩精品91| 国产精品流白浆视频| 欧美伦理影视网| 色婷婷综合久久久久中文一区二区 | 91久久在线观看| 黄视频在线观看免费| 色综合天天综合给合国产| 7788色淫网站小说| 中文字幕一区二区三区在线视频| 国产日韩av在线播放| 国产一二在线观看| 欧美日韩国产综合一区二区| 天堂网中文在线观看| 天堂资源在线中文精品| 日韩欧美第二区在线观看| 亚洲最大成人| 在线观看国产精品91| 中文字幕一区二区免费| 国产午夜精品久久久久久久| 日本人视频jizz页码69| 波多野结衣在线观看一区二区| 国产精品视频网址| 黄色片在线播放| 69堂成人精品免费视频| 欧美日韩国产精品综合| 国产精品一二三四五| 国产av麻豆mag剧集| 亚洲人成网站77777在线观看| 国产精品久久中文| 麻豆传媒在线免费| 亚洲电影免费观看高清完整版在线观看 | 神马影院一区二区| 久久91超碰青草在哪里看| 欧美一区二区三区免费看| 国产精品久久久久一区二区三区共| 成人一区二区三区在线观看| 一区二区高清视频| 97色婷婷成人综合在线观看| 欧美激情精品久久久久久蜜臀| 亚洲av成人无码网天堂| 欧美性色19p| 国产黄色的视频| 成人妖精视频yjsp地址| 男人搞女人网站| 亚洲影视一区| 欧美三级网色| 国产精品久久久久久久久久辛辛 | 亚洲av无码久久精品色欲| 日韩午夜高潮| 制服国产精品| 老司机凹凸av亚洲导航| 亚洲一区二区免费| av日韩电影| 26uuu国产精品视频| 女女色综合影院| 国产一区二区激情|