《電子技術應用》
您所在的位置:首頁 > 其他 > 設計應用 > Android游戲開發之詳解SQLite存儲
Android游戲開發之詳解SQLite存儲
CSDN
摘要: 本篇主要是向大家介紹一種適合游戲數據存儲的方式:SQLite輕量級數據庫
Abstract:
Key words :

  先介紹幾個基本概念知識:

  什么是SQLite

  SQLite是一款輕量級數據庫,它的設計目的是嵌入式,而且它占用的資源非常少,在嵌入式設備中,只需要幾百KB!!!!!

  SQLite的特性:

  輕量級

  使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。

  獨立性

  SQLite 數據庫的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。

  隔離性

  SQLite 數據庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。

  跨平臺

  SQLite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:Android

  多語言接口

  SQLite 數據庫支持多語言編程接口。

  安全性

  SQLite 數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只能有一個可以寫入數據。

  優點:

        1.能存儲較多的數據。

  2.能將數據庫文件存放到SD卡中!

  什么是 SQLiteDatabase?

  一個 SQLiteDatabase 的實例代表了一個SQLite 的數據庫,通過SQLiteDatabase 實例的一些方法,我們可以執行SQL 語句,對數 據庫進行增、刪、查、改的操作。需要注意的是,數據庫對于一個應用來說是私有的,并且在一個應用當中,數據庫的名字也是惟一的。

  什么是 SQLiteOpenHelper ?

  根據這名字,我們可以看出這個類是一個輔助類。這個類主要生成一個數據庫,并對數據庫的版本進行管理。當在程序當中調用這個類的 方法getWritableDatabase(),或者getReadableDatabase()方法的時候,如果當時沒有數據,那么Android 系統就會自動生成一 個數 據庫。SQLiteOpenHelper 是一個抽象類,我們通常需要繼承它,并且實現里邊的3 個函數,

  什么是 ContentValues 類?

  ContentValues 類和Hashmap/Hashtable 比較類似,它也是負責存儲一些名值對,但是它存儲的名值對當中的名是一個

  String 類型,而值都是基本類型。

  什么是 Cursor ?

  Cursor 在Android 當中是一個非常有用的接口,通過Cursor 我們可以對從數據庫查詢出來的結果集進行隨 機的讀寫訪問。

  OK,基本知識就介紹到這里,下面開始上代碼:還是按照我的一貫風格,代碼中該解釋的地方都已經在代碼中及時注釋和講解了!

  順便來張項目截圖:

  

  先給出xml:

  view plaincopy to clipboardprint?

  ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  《?xml version=“1.0” encoding=“utf-8”?》

  《LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

  android:orientation=“vertical” android:layout_width=“fill_parent”

  android:layout_height=“fill_parent”》

  《TextView android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“SQL 練習!(如果你使用的SD卡存儲數據方式,為了保證正常操作,請你先點擊創建一張表然后再操作)”

  android:textSize=“20sp” android:textColor=“#ff0000” android:id=“@+id/tv_title” /》

  《Button android:id=“@+id/sql_addOne” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“插入一條記錄”》《/Button》

  《Button android:id=“@+id/sql_check” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“查詢數據庫”》《/Button》

  《Button android:id=“@+id/sql_edit” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“修改一條記錄”》《/Button》

  《Button android:id=“@+id/sql_deleteOne” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“刪除一條記錄”》《/Button》

  《Button android:id=“@+id/sql_deleteTable” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“刪除數據表單”》《/Button》

  《Button android:id=“@+id/sql_newTable” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“新建數據表單”》《/Button》

  《/LinearLayout》

  先介紹幾個基本概念知識:

  什么是SQLite:

  SQLite是一款輕量級數據庫,它的設計目的是嵌入式,而且它占用的資源非常少,在嵌入式設備中,只需要幾百KB!!!!!

  SQLite的特性:

  輕量級

  使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。

  獨立性

  SQLite 數據庫的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。

  隔離性

  SQLite 數據庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。

  跨平臺

  SQLite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:Android。

  多語言接口

  SQLite 數據庫支持多語言編程接口。

  安全性

  SQLite 數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只能有一個可以寫入數據。

  優點:

        1.能存儲較多的數據。

  2.能將數據庫文件存放到SD卡中!

  什么是 SQLiteDatabase?

  一個 SQLiteDatabase 的實例代表了一個SQLite 的數據庫,通過SQLiteDatabase 實例的一些方法,我們可以執行SQL 語句,對數 據庫進行增、刪、查、改的操作。需要注意的是,數據庫對于一個應用來說是私有的,并且在一個應用當中,數據庫的名字也是惟一的。

  什么是 SQLiteOpenHelper ?

  根據這名字,我們可以看出這個類是一個輔助類。這個類主要生成一個數據庫,并對數據庫的版本進行管理。當在程序當中調用這個類的 方法getWritableDatabase(),或者getReadableDatabase()方法的時候,如果當時沒有數據,那么Android 系統就會自動生成一 個數 據庫。SQLiteOpenHelper 是一個抽象類,我們通常需要繼承它,并且實現里邊的3 個函數,

  什么是 ContentValues 類?

  ContentValues 類和Hashmap/Hashtable 比較類似,它也是負責存儲一些名值對,但是它存儲的名值對當中的名是一個

  String 類型,而值都是基本類型。

  什么是 Cursor ?

  Cursor 在Android 當中是一個非常有用的接口,通過Cursor 我們可以對從數據庫查詢出來的結果集進行隨 機的讀寫訪問。

  OK,基本知識就介紹到這里,下面開始上代碼:還是按照我的一貫風格,代碼中該解釋的地方都已經在代碼中及時注釋和講解了!

  順便來張項目截圖:

  

  先給出xml:

  view plaincopy to clipboardprint?

  ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  《?xml version=“1.0” encoding=“utf-8”?》

  《LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

  android:orientation=“vertical” android:layout_width=“fill_parent”

  android:layout_height=“fill_parent”》

  《TextView android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“SQL 練習!(如果你使用的SD卡存儲數據方式,為了保證正常操作,請你先點擊創建一張表然后再操作)”

  android:textSize=“20sp” android:textColor=“#ff0000” android:id=“@+id/tv_title” /》

  《Button android:id=“@+id/sql_addOne” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“插入一條記錄”》《/Button》

  《Button android:id=“@+id/sql_check” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“查詢數據庫”》《/Button》

  《Button android:id=“@+id/sql_edit” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“修改一條記錄”》《/Button》

  《Button android:id=“@+id/sql_deleteOne” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“刪除一條記錄”》《/Button》

  《Button android:id=“@+id/sql_deleteTable” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“刪除數據表單”》《/Button》

  《Button android:id=“@+id/sql_newTable” android:layout_width=“fill_parent”

  android:layout_height=“wrap_content” android:text=“新建數據表單”》《/Button》

  《/LinearLayout》

  xml中定義了我們需要練習用到的幾個操作按鈕,這里不多解釋了,下面看java源碼:先看我們繼承的 SQLiteOpenHelper 類

  view plaincopy to clipboardprint?

  ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  package com.himi;

  import android.content.Context;

  import android.database.sqlite.SQLiteDatabase;

  import android.database.sqlite.SQLiteOpenHelper;

  import android.util.Log;

  /**

  *

  * @author Himi

  * @解釋 此類我們只需要傳建一個構造函數 以及重寫兩個方法就OK啦、

  *

  */

  public class MySQLiteOpenHelper extends SQLiteOpenHelper {

  public final static int VERSION = 1;// 版本號

  public final static String TABLE_NAME = “himi”;// 表名

  public final static String ID = “id”;// 后面ContentProvider使用

  public final static String TEXT = “text”;

  public static final String DATABASE_NAME = “Himi.db”;

  public MySQLiteOpenHelper(Context context) {

  // 在Android 中創建和打開一個數據庫都可以使用openOrCreateDatabase 方法來實現,

  // 因為它會自動去檢測是否存在這個數據庫,如果存在則打開,不過不存在則創建一個數據庫;

  // 創建成功則返回一個 SQLiteDatabase對象,否則拋出異常FileNotFoundException。

  // 下面是來創建一個名為“DATABASE_NAME”的數據庫,并返回一個SQLiteDatabase對象

  super(context, DATABASE_NAME, null, VERSION);

  }

  @Override

  // 在數據庫第一次生成的時候會調用這個方法,一般我們在這個方法里邊生成數據庫表;

  public void onCreate(SQLiteDatabase db) {

  String str_sql = “CREATE TABLE ” + TABLE_NAME + “(” + ID

  + “ INTEGER PRIMARY KEY AUTOINCREMENT,” + TEXT + “ text );”;

  // CREATE TABLE 創建一張表 然后后面是我們的表名

  // 然后表的列,第一個是id 方便操作數據,int類型

  // PRIMARY KEY 是指主鍵 這是一個int型,用于唯一的標識一行;

  // AUTOINCREMENT 表示數據庫會為每條記錄的key加一,確保記錄的唯一性;

  // 最后我加入一列文本 String類型

  // ----------注意:這里str_sql是sql語句,類似dos命令,要注意空格!

  db.execSQL(str_sql);

  // execSQL()方法是執行一句sql語句

  // 雖然此句我們生成了一張數據庫表和包含該表的sql.himi文件,

  // 但是要注意 不是方法是創建,是傳入的一句str_sql這句sql語句表示創建!!

  }

  @Override

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  // 一般默認情況下,當我們插入 數據庫就立即更新

  // 當數據庫需要升級的時候,Android 系統會主動的調用這個方法。

  // 一般我們在這個方法里邊刪除數據表,并建立新的數據表,

  // 當然是否還需要做其他的操作,完全取決于游戲需求。

  Log.v(“Himi”, “onUpgrade”);

  }

  }

  我喜歡代碼中立即附上解釋,感覺這樣代碼比較讓大家更容易理解和尋找,當然如果童鞋們不喜歡,可以告訴我,我改~嘿嘿~

  下面看最重要的MainActivity中的代碼:

  view plaincopy to clipboardprint?

  ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  package com.himi;

  import java.io.File;

  import java.io.IOException;

  import android.app.Activity;

  import android.content.ContentValues;

  import android.database.Cursor;

  import android.database.sqlite.SQLiteDatabase;

  import android.os.Bundle;

  import android.view.View;

  import android.view.Window;

  import android.view.WindowManager;

  import android.view.View.OnClickListener;

  import android.widget.Button;

  import android.widget.TextView;

  // ------------第三種保存方式--------《SQLite》---------

  /**

  * @author Himi

  * @保存方式:SQLite 輕量級數據庫、

  * @優點: 可以將自己的數據存儲到文件系統或者數據庫當中, 也可以將自己的數據存

  * 儲到SQLite數據庫當中,還可以存到SD卡中

  * @注意1:數據庫對于一個游戲(一個應用)來說是私有的,并且在一個游戲當中,

  * 數據庫的名字也是唯一的。

  * @注意2 apk中創建的數據庫外部的進程是沒有權限去讀/寫的,

  * 我們需要把數據庫文件創建到sdcard上可以解決類似問題。

  * @注意3 當你刪除id靠前的數據或者全部刪除數據的時候,SQLite不會自動排序,

  * 也就是說再添加數據的時候你不指定id那么SQLite默認還是在原有id最后添加一條新數據

  * @注意4 android 中 的SQLite 語法區分大小寫的!!!!!這點要注意!

  * String UPDATA_DATA = “UPDATE himi SET text=‘通過SQL語句來修改數據’ WHERE id=1”;

  * 千萬 不能可以寫成

  * String UPDATA_DATA = “updata himi set text=‘通過SQL語句來修改數據’ where id=1”;

  */

  public class MainActivity extends Activity implements OnClickListener {

  private Button btn_addOne, btn_deleteone, btn_check, btn_deleteTable,

  btn_edit, btn_newTable;

  private TextView tv;

  private MySQLiteOpenHelper myOpenHelper;// 創建一個繼承SQLiteOpenHelper類實例

  private SQLiteDatabase mysql ;

  //---------------以下兩個成員變量是針對在SD卡中存儲數據庫文件使用

  // private File path = new File(“/sdcard/himi”);// 創建目錄

  // private File f = new File(“/sdcard/himi/himi.db”);// 創建文件

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

  WindowManager.LayoutParams.FLAG_FULLSCREEN);

  this.requestWindowFeature(Window.FEATURE_NO_TITLE);

  setContentView(R.layout.main);

  tv = (TextView) findViewById(R.id.tv_title);

  btn_addOne = (Button) findViewById(R.id.sql_addOne);

  btn_check = (Button) findViewById(R.id.sql_check);

  btn_deleteone = (Button) findViewById(R.id.sql_deleteOne);

  btn_deleteTable = (Button) findViewById(R.id.sql_deleteTable);

  btn_newTable = (Button) findViewById(R.id.sql_newTable);

  btn_edit = (Button) findViewById(R.id.sql_edit);

  btn_edit.setOnClickListener(this);

  btn_addOne.setOnClickListener(this);

  btn_check.setOnClickListener(this);

  btn_deleteone.setOnClickListener(this);

  btn_deleteTable.setOnClickListener(this);

  btn_newTable.setOnClickListener(this);

  myOpenHelper = new MySQLiteOpenHelper(this);// 實例一個數據庫輔助器

  //備注1 ----如果你使用的是將數據庫的文件創建在SD卡中,那么創建數據庫mysql如下操作:

  // if (!path.exists()) {// 目錄存在返回false

  // path.mkdirs();// 創建一個目錄

  // }

  // if (!f.exists()) {// 文件存在返回false

  // try {

  // f.createNewFile();//創建文件

  // } catch (IOException e) {

  // // TODO Auto-generated catch block

  // e.printStackTrace();

  // }

  // }

  }

  @Override

  public void onClick(View v) {

  try {

  //備注2----如果你使用的是將數據庫的文件創建在SD卡中,那么創建數據庫mysql如下操作:

  // mysql = SQLiteDatabase.openOrCreateDatabase(f, null);

  //備注3--- 如果想把數據庫文件默認放在系統中,那么創建數據庫mysql如下操作:

  mysql = myOpenHelper.getWritableDatabase(); // 實例數據庫

  if (v == btn_addOne) {// 添加數據

  // ---------------------- 讀寫句柄來插入---------

  // ContentValues 其實就是一個哈希表HashMap, key值是字段名稱,

  //Value值是字段的值。然后 通過 ContentValues 的 put 方法就可以

  //把數據放到ContentValues中,然后插入到表中去!

  ContentValues cv = new ContentValues();

  cv.put(MySQLiteOpenHelper.TEXT, “測試新的數據”);

  mysql.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);

  // inser() 第一個參數 標識需要插入操作的表名

  // 第二個參數 :默認傳null即可

  // 第三個是插入的數據

  // ---------------------- SQL語句插入--------------

  // String INSERT_DATA =

  // “INSERT INTO himi (id,text) values (1, ‘通過SQL語句插入’)”;

  // db.execSQL(INSERT_DATA);

  tv.setText(“添加數據成功!點擊查看數據庫查詢”);

  } else if (v == btn_deleteone) {// 刪除數據

  // ---------------------- 讀寫句柄來刪除

  mysql.delete(“himi”, MySQLiteOpenHelper.ID + “=1”, null);

  // 第一個參數 需要操作的表名

  // 第二個參數為 id+操作的下標 如果這里我們傳入null,表示全部刪除

  // 第三個參數默認傳null即可

  // ----------------------- SQL語句來刪除

  // String DELETE_DATA = “DELETE FROM himi WHERE id=1”;

  // db.execSQL(DELETE_DATA);

  tv.setText(“刪除數據成功!點擊查看數據庫查詢”);

  } else if (v == btn_check) {// 遍歷數據

  //備注4------

  Cursor cur = mysql.rawQuery(“SELECT * FROM ”

  + MySQLiteOpenHelper.TABLE_NAME, null);

  if (cur != null) {

  String temp = “”;

  int i = 0;

  while (cur.moveToNext()) {//直到返回false說明表中到了數據末尾

  temp += cur.getString(0);

  // 參數0 指的是列的下標,這里的0指的是id列

  temp += cur.getString(1);

  // 這里的0相對于當前應該是咱們的text列了

  i++;

  temp += “ ”; // 這里是我整理顯示格式 ,呵呵~

  if (i % 3 == 0) // 這里是我整理顯示格式 ,呵呵~

  temp += “\n”;// 這里是我整理顯示格式 ,呵呵~

  }

  tv.setText(temp);

  }

  } else if (v == btn_edit) {// 修改數據

  // ------------------------句柄方式來修改 -------------

  ContentValues cv = new ContentValues();

  cv.put(MySQLiteOpenHelper.TEXT, “修改后的數據”);

  mysql.update(“himi”, cv, “id ” + “=” + Integer.toString(3), null);

  // ------------------------SQL語句來修改 -------------

  // String UPDATA_DATA =

  // “UPDATE himi SET text=‘通過SQL語句來修改數據’ WHERE id=1”;

  // db.execSQL(UPDATA_DATA);

  tv.setText(“修改數據成功!點擊查看數據庫查詢”);

  } else if (v == btn_deleteTable) {// 刪除表

  mysql.execSQL(“DROP TABLE himi”);

  tv.setText(“刪除表成功!點擊查看數據庫查詢”);

  } else if (v == btn_newTable) {// 新建表

  String TABLE_NAME = “himi”;

  String ID = “id”;

  String TEXT = “text”;

  String str_sql2 = “CREATE TABLE ” + TABLE_NAME + “(” + ID

  + “ INTEGER PRIMARY KEY AUTOINCREMENT,” + TEXT

  + “ text );”;

  mysql.execSQL(str_sql2);

  tv.setText(“新建表成功!點擊查看數據庫查詢”);

  }

  // 刪除數據庫:

  // this.deleteDatabase(“himi.db”);

  } catch (Exception e) {

  tv.setText(“操作失敗!”);

  } finally {// 如果try中異常,也要對數據庫進行關閉

  mysql.close();

  }

  }

  }

  以上代碼中我們實現了兩種存儲方式:

  一種存儲默認系統路徑/data-data-com.himi-databases下,另外一種則是保存在了/sdcard-himi下,生成數據庫文件himi.db

  那么這里兩種實現方式大概步驟和區別說下:

  -----------如果我們使用默認系統路徑存儲數據庫文件:

  第一步:新建一個類繼承SQLiteOpenHelper;寫一個構造,重寫兩個函數!

  第二步:在新建的類中的onCreate(SQLiteDatabase db) 方法中創建一個表;

  第三步:在進行刪除數據、添加數據等操作的之前我們要得到數據庫讀寫句柄得到一個數據庫實例;

  注意: 繼承寫這個輔助類,是為了在我們沒有數據庫的時候自動為我們生成一個數據庫,并且生成數據庫文件,這里也同時創建了一張表,因為我們在onCreate里是在數據庫中創建一張表的操作;這里還要注意在我們new 這個我們這個MySQLiteOpenHelper 類實例對象的時候并沒有創建數據庫喲~!而是在我們調用 (備注3)MySQLiteOpenHelper 。.getWritableDatabase() 這個方法得到數據庫讀寫句柄的時候,android 會分析是否已經有了數據庫,如果沒有會默認為我們創建一個數據庫并且在系統路徑data-data-com.himi-databases下生成himi.db 文件!

  (如果我們使用sd卡存儲數據庫文件,就沒有必要寫這個類了,而是我們自己Open自己的文件得到一個數據庫,西西,反而方便~ )

  -----------如果我們需要把數據庫文件存儲到SD卡中:

  第一步:確認模擬器存在SD卡,關于SD卡的兩種創建方法見我的博文:【Android 2D游戲開發之十】

  第二步:(備注1)先創建SD卡目錄和路徑已經我們的數據庫文件!這里不像上面默認路徑中的那樣,如果沒有數據庫會默認系統路徑生成一個數據庫和一個數據庫文件!我們必須手動創建數據庫文件!

  第三步:在進行刪除數據、添加數據等操作的之前我們要得到數據庫讀寫句柄得到一個數據庫實例;(備注2)此時的創建也不是像系統默認創建,而是我們通過打開第一步創建好的文件得到數據庫實例。這里僅僅是創建一個數據庫!!!!

  第四步:在進行刪除數據、添加數據等操作的之前我們還要創建一個表!

  第五步:在配置文件AndroidMainfest.xml 聲明寫入SD卡的權限,上一篇已經介紹權限了,不知道的自己去看下吧。

  有些童鞋不理解什么默認路徑方式中就有表?那是因為我們在它默認給我們創建數據庫的時候我們有創建表的操作,就是MySQLiteOpenHelper類中的onCreate()方法里的操作!所以我們如果要在進行刪除數據、添加數據等操作的之前還要創建一個表,創建表的方法都是一樣的。

  總結:不管哪種方式我們都要-創建數據庫-創建表-然后進行操作!

  備注4:

  在Android中查詢數據是通過Cursor類來實現的,當我們使用SQLiteDatabase.query()方法時,會得到一個Cursor對象,Cursor指向的就是每一條數據。它提供了很多有關查詢的方法,具體方法如下:

  以下是方法和說明:

  move 以當前的位置為參考,將Cursor移動到指定的位置,成功返回true, 失敗返回false

  moveToPosition 將Cursor移動到指定的位置,成功返回true,失敗返回false

  moveToNext 將Cursor向前移動一個位置,成功返回true,失敗返回false

  moveToLast 將Cursor向后移動一個位置,成功返回true,失敗返回 false。

  movetoFirst 將Cursor移動到第一行,成功返回true,失敗返回false

  isBeforeFirst 返回Cursor是否指向第一項數據之前

  isAfterLast 返回Cursor是否指向最后一項數據之后

  isClosed 返回Cursor是否關閉

  isFirst 返回Cursor是否指向第一項數據

  isLast 返回Cursor是否指向最后一項數據

  isNull 返回指定位置的值是否為null

  getCount 返回總的數據項數

  getInt 返回當前行中指定的索引數據

  對于SQLite的很多童鞋有接觸過,但是就不知道怎么存儲在SD中,所以我也研究了下,這篇也寫了把sd卡中的方式也提供給大家。

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 97久久精品人人澡人人爽缅北 | 字幕网在线观看 | 91欧美精品成人综合在线观看 | 性开放少妇xxxxⅹ视频蜜桃 | 黑人中文字幕一区二区三区 | 91自产国偷拍在线 | 热热av| 麻豆国产va免费精品高清在线 | 成人欧美一区二区三区在线 | 日韩免费视频 | 92看片淫黄大片看国产片 | 少妇下面好紧好多水真爽播放 | 国产偷自拍 | 久久99热人妻偷产国产 | 小早川怜子xxxxaⅴ在线 | 欧美精品无码一区二区三区 | 少妇乳大丰满诱人2 | 97精品久久久 | 人妻一本久道久久综合久久鬼色 | 国产一级片免费视频 | 添女人囗交vk | 青青草视频免费观看 | 欧美一区二区免费视频 | 少妇啪啪高潮肉谢 | 中文字幕免费高清在线观看 | 人妻无码久久精品人妻 | 国产综合在线观看 | 国产精品嫩草影院桃色 | 日本www.小久久 | 爱情岛论坛线路一区二区 | 毛片网站在线 | 农村末发育av片四区五区 | 男人天堂av在线播放 | 在线中文字幕av | 夜夜春夜夜爽 | 九色婷婷 | 亚洲精品久久一区二区三区777 | 亚洲激情小视频 | 农民人伦一区二区三区 | 天天躁狠狠躁狠狠躁夜夜躁68 | 九九在线中文字幕无码 | 91精品啪在线观看国产线免费 | 婷婷综合久久中文字幕蜜桃三电影 | 国产原创一区 | 国产欧美wwwxj在线观看 | 久久这里有 | 久久精品视频一区二区三区 | 高h公妇烈火 | 午夜肉伦伦影院 | 亚洲国产成人一区二区在线 | 日本xxxxwwwww| 激情女主播 | 怡红院男人天堂 | 日本黄色小说 | 日本黄页视频 | 欧美性狂猛xxxxxbbbbb | 99嫩草| 日日插夜夜爽 | 国产成人精品无码免费看夜聊软件 | 久草网视频 | 伊人色综合一区二区三区 | 欧美我不卡 | 就是色| 成人午夜av国产传媒 | 成人免费无码大片a毛片抽搐 | 欧美黑人性暴力猛交喷水黑人巨大 | 中国少妇做爰全过程毛片 | 在线视频免费观看一区 | 熟女人妻一区二区三区免费看 | 激情综合网婷婷 | 亚洲综合av一区二区 | 国产视频999 | 麻豆免费在线观看视频 | 成人午夜精品久久久久久久网站 | 一区不卡在线 | 国产视频黄 | 国产精品一区二区吃奶在线观看 | 久久人人爽人人 | 欧美一级欧美三级在线观看 | 日本一区不卡 | 欧美色哟哟 | 国产又大又硬又粗无遮挡 | 中文字幕中出 | 国产精品农村妇女白天高潮 | 亚洲国产日韩欧美一区二区三区 | 欧美一区二区免费 | 91精品国产综合久久精品性色 | 伊人情人色综合网站 | 人与动性xxx视频 | 黄色一级片一级片 | 人体写真 福利视频 | 亚洲欧美综合视频 | 久久综合久久久 | 91精品国产人妻国产毛片在线 | 亚洲成av人在线观看网址 | 中文字幕丰满人孑伦 | 国产精品无码素人福利 | 欧美三级在线视频 | 熟女视频一区二区在线观看 | 伊人自拍视频 | 91久久亚洲 | 国内精品免费视频 | 黄色激情小说网站 | 蜜桃成人在线 | 亚欧精品在线 | 日韩av午夜在线观看 | 国产精品毛片久久久 | 午夜精品一区二区国产 | 99热热热| 久久亚洲国产成人影院 | 午夜久久网 | 永久免费汤不热视频 | 中文字幕在线一区 | 国产亚洲精品久久久久久国模美 | 亚洲综合成人亚洲 | 日韩视频免费观看高清 | 午夜视频福利在线观看 | 欧美手机看片 | 国产精品影音先锋 | 国产精品麻豆欧美日韩ww | 97久久精品人人做人人爽 | 性开放按摩bbwbbw视频 | jzzijzzij亚洲成熟少妇18 jzzijzzij亚洲农村妇女 | 成人视屏在线观看 | 黄视频免费在线观看 | 国模小黎自慰gogo人体 | 蜜桃视频插满18在线观看 | 日韩精品久久无码中文字幕 | 涩涩网站免费 | 久久成人国产精品 | 91精品啪 | 精品人妻av区波多野结衣 | 成人日韩av | 欧美女优在线观看 | 国产精品vⅰdeoxxxx国产 | 亚洲综合av色婷婷 | 五月天婷婷缴情五月免费观看 | 成在人线av无码免观看麻豆 | 午夜美女福利 | 日本少妇xxxxxx | 永久中文字幕 | 尤物网址在线观看 | 一本色道久久99一综合 | 亚洲成人www | 欧美久久久久久久高潮 | 一级黄色大片网站 | 第四色在线视频 | 欧美一区1区三区3区公司 | 96av在线 | 欧美瑟瑟 | 欧美一级性视频 | 亚洲情侣av| 中文字幕中出 | 国产性猛交xx乱老孕妇 | 欧美黑人又粗又大久久久 | 一级特黄性色生活片 | 日本乱人伦在线观看 | 成人性生交大片免费看r链接 | 欧美激情国产在线 | 99这里只有精品视频 | 美女隐私免费观看 | 国产成人欧美综合在线影院 | 国产私拍大尺度在线视频 | 丰满白嫩欧洲美女图片 | 男人午夜剧场 | 日本黄色片在线播放 | 制服 丝袜 激情 欧洲 亚洲 | 日本欧美国产在线 | 成人精品网站在线观看 | 97av免费视频| 欧美日韩一区在线观看 | 国产一区亚洲 | 亚洲综合色丁香婷婷六月图片 | 一区二区国产精品精华液 | 国产精品一二三区视频 | 最近2019中文字幕大全第二页 | 在线观看国产亚洲 | 色射综合| www免费黄色 | 亚洲国产天堂久久综合 | 99精品视频在线观看 | 美女视频黄频a免费 | 亚洲日本中文字幕在线 | 夜夜性日日交xxx性视频 | 日韩av成人免费看 | 亚洲私拍 | 美女屁股眼视频网站 | 五月婷婷网站 | 18禁裸乳无遮挡自慰免费动漫 | 久草美女| 亚洲国产成人爱av在线播放 | 超碰97在线播放 | 国产女主播喷水视频在线观看 | 亚洲乱码av中文一二区软件 | 国产精品第一 | 中文久久乱码一区二区 | 优月まりな乳狂在线观看 | 九九精品在线观看 | 国产精品成人一区二区艾草 | 日韩无| 少妇高潮惨叫久久久久久 | 久久一级片视频 | 91人人爽 | 激情五月俺也去 | 国产小视频免费 | 五月丁香色综合久久4438 | 欧洲金发美女大战黑人 | 欧美乱妇日本无乱码特黄大片 | 樱桃视频影视在线观看免费 | 国产精品农村妇女bbw | 日韩乱论 | 国产精品爽爽久久 | 亚洲天堂资源网 | 日韩中文字幕区一区有砖一区 | 又粗又硬大战丰满少妇 | 操女人视频网站 | 91免费 看片 | 欧美一a一片一级一片 | 肉色超薄丝袜脚交一区二区蜜av | 在线播放国产一区二区三区 | 国产成人精品综合在线观看 | 特黄一级片 | 成人性生交大片免费8 | 欧美另类极品 | 手机看片国产日韩 | 亚洲裸男自慰gv网站 | 日韩美女做爰高潮免费 | 久草视频污 | 日日橹狠狠爱欧美视频 | 美女激情网站 | 熟女性饥渴一区二区三区 | 天天看天天色 | 欧美自拍第一页 | 久久女人网 | 国产女人第一次做爰毛片 | 久久99精品久久久秒播软件优势 | 国产一区二区视频播放 | 国产精品丝袜 | 免费又黄又裸乳的视频 | 国产乱人激情h在线观看 | 高清一区二区三区日本久 | 亚洲女同2 | 中文字幕无码视频手机免费看 | 亚洲成a人无码 | 一本无码人妻在中文字幕免费 | 欧美特级视频 | 一区二区三区毛片 | 黑人精品一区二区 | 免费久久片| 一点色成人网 | 久久久久逼 | 伊人久久婷婷色综合98网 | 女同三级bd高清在线播放 | 99久久99久久精品 | 久操免费在线视频 | 亚洲精品色在线网站 | aaaaa国产欧美一区二区 | 国产亚洲欧美日韩在线一区二区三区 | 亚洲一本之道 | 白嫩少妇喷水正在播放 | 18禁黄无码免费网站高潮 | 亚洲天堂一区二区三区四区 | 国产精品丝袜在线 | 麻豆免费看片 | 成人在线观看网站 | 国内精品久久久久伊人av | 欧洲欧美人成视频在线 | 好了av四色综合无码 | 欧美日韩精品一区二区三区蜜桃 | 日韩精品成人一区二区在线观看 | 国产成人亚洲日韩欧美 | 少妇下蹲下露大唇58 | 色婷婷夜夜躁狠狠躁麻豆免费 | 欧美bbbb内谢 | 夜夜爽爽 | 日日爱影视 | 亚洲蜜桃v妇女 | 日本人xxxxxxxxx19 | 男女一级黄色 | 综合三区后入内射国产馆 | 欧美片在线观看 | 狠狠色噜噜狠狠狠狠色综合网 | 引诱农村少妇性事 | 黑人狂躁中国少妇and | 牛鞭伸入女人下身的真视频 | 免费jjzz在在线播放国产 | 国产综合无码一区二区色蜜蜜 | 成人羞羞视频在线观看免费 | 色视频网 | 一区二区在线免费 | 夜爽8888视频在线观看 | 疯狂三人交性欧美 | 日本黄色性视频 | 夜夜嗨av色一区二区不卡 | gogo肉体亚洲高清在线视 | 色福利在线 | 首页干日本少妇 | av播播| 开心五月综合亚洲 | 免费看a网站 | 久久婷婷综合99啪69影院 | 成人av亚洲 | 日韩精品免费看 | 精品无码黑人又粗又大又长 | 国产天堂在线 | 97精品人妻一区二区三区香蕉 | 明日叶三叶 | 又黄又爽又无遮挡免费的网站 | 怡红院a∨人人爰人人爽 | 曰批女人视频在线观看 | 国产女主播视频一区二区 | 成年在线观看免费视频 | 美女视频黄a视频免费全程软件 | av老司机在线播放 | 国产精品色网 | 日本不卡高字幕在线2019 | 色老大视频 | jvid福利写真一区二区三区 | 高h乱l高辣h文乱古文 | 国产小受呻吟gv视频在线观看 | 女十八免费毛片视频 | 亚洲成av人片在一线观看 | 男男毛片 | 秋葵视频成人 | 成人网在线免费观看 | 久久久资源网 | 欧美日韩精品区别 | 在线黄色av | 性按摩玩人妻hd中文字幕 | 99pao在线视频国产 | 成人小视频在线观看 | 日韩亚洲欧美精品综合 | 伊人久久久久久久久久久久 | 久久久噜噜噜久久久 | 天堂а√中文最新版在线 | 亚欧av在线 | 一本一本久久a久久精品综合不卡 | 色欲久久久天天天综合网 | 久久精品欧美一区二区三区麻豆 | 日韩中文字幕在线一区二区 | 日韩精品一区二区三区四区新区 | 69影院少妇在线观看 | eeuss亚洲精品久久 | 嫩草在线看 | 91亚洲国产成人久久精品网站 | 国产欧美视频一区 | 中文字幕欧美人妻精品一区 | 欧美精品与人动性物交免费看 | 国内自拍视频一区二区三区 | 欧美v国产v亚洲v日韩九九 | 色哺乳xxxxxhd | 国产精品9 | 国产99久久久国产精品免费高清 | 熟女人妻一区二区三区免费看 | 国产精久久久久 | 青青青手机在线视频 | 成人91免费 | av小说天堂网 | 日韩精品极品视频在线观看免费 | aaa日韩| 色诱av手机版 | 亚洲乱码xxxxxxxx| 国产成人无码a区在线视频无码dvd | 99久久国 | 91久久精品国产91性色69 | 逼特逼视频在线观看 | 久久永久免费 | 亚洲天码中字 | 国产精成人 | 国产亚洲精品久久久久久无几年桃 | 日本不良网站在线观看 | www视频一区 | 日韩精品乱码av一区二区 | 九九久久精品国产av片国产 | 在线免费av网 | 国产真实乱偷精品视频免 | 欧美日韩有码 | 欧美日韩精品中文字幕 | 交做爰xxxⅹ性爽 | 超碰福利在线观看 | 三级毛片国产三级毛片 | 一区二区视频观看 | 久久久久久影院 | 日韩久久精品一区二区三区 | 免费视频成人 | 中文字幕一区二区人妻性色 | 宝宝好涨水快流出来免费视频 | 五月天婷婷伊人 | 久久久www成人免费无遮挡大片 | 国产成人精品在线播放 | 天堂资源网 | 老牛嫩草二区三区观影体验 | 免费观看成人毛片a片 | 三级慰安女妇威狂放播 | 青青草精品在线 | 成熟交bgmbgmbgm在线 | 日韩在线观看中文字幕 | 久久久噜噜噜久久 | av一级免费 | 日日av拍夜夜添久久免费 | 欧美成人免费一区二区三区 | 国产精品成人av在线观看 | 巨爆乳无码视频在线观看 | 91在线丨porny丨国产 | 少妇情欲一区二区影视 | 国产精品自在在线午夜 | www欧美日韩 | 久热在线视频 | 真人做人试看60分钟免费 | 精品视频麻豆入口 | 免费看黄网站在线观看 | 久久接色 | 中文字幕午夜精品一区二区三区 | 欧美国产中文字幕 | 日韩激情一区二区 | 亚洲欧美自拍偷拍 | 无码人妻精品一区二区三区蜜桃 | a级在线播放| 成人性生交大片免费看r老牛网站 | 手机av在线不卡 | 精品国产91乱码一区二区三区 | 日日夜夜添| 亚洲综合av一区二区三区 | 一区二区在线免费视频 | 69xxx免费视频| 人妻人人澡人人添人人爽人人玩 | 制服丝袜国产在线 | 久久精品国产99精品国产亚洲性色 | 天天做爰裸体免费视频 | 亚洲国产成人久久一区二区三区 | 色哒哒影院 | 色狠狠av北条麻妃 | 伊人网91| 中文字幕第一页亚洲 | yy8090新视觉午夜毛片 | 丁香五月亚洲综合在线 | 18无码粉嫩小泬无套在线观看 | 91av小视频| 无码日韩精品一区二区人妻 | 性色欲网站人妻丰满中文久久不卡 | 九九影院理论片私人影院 | 91精品国产乱码在线观看 | 久久一区二区三区精华液使用 | 国产真人真事毛片 | 一个色的综合 | 欧美jizzhd精品欧美巨大免费 | 精品国产精品三级精品av网址 | 国产成人8x视频网站入口 | 国产精品一区二av18款 | 午夜伦理久久 | 精精国产xxxx视频在线播放 | 影音先锋中文字幕在线播放 | 国产精品一区二三区 | 神马久久久久久久久 | 国产无在线观看 | 午夜日本永久乱码免费播放片 | 强开小嫩苞一区二区三区网站 | 美女爱爱爱 | 国产老头和老头xxxxx免费 | 日韩午夜伦 | 五月天三级 | 亚洲成人在线视频播放 | 乡村美女户外勾搭av | 无码精品a∨在线观看中文 亚洲熟妇自偷自拍另欧美 无码少妇a片一区二区三区 | 人人干干| 久久99精品久久久久 | 超高清日韩aⅴ大片美女图片 | 国产精品美女www爽爽爽三炮 | 国产草草影院 | 91精品国产高清一区二区三区蜜臀 | 天堂a视频 | 动漫av永久无码精品每日更新 | 三级国产三级在线 | av综合色 | 国产精品免费久久久久影院 | 欧美一区日韩一区 | 一级黄色大片网站 | 在线观看网址你懂的 | 国产精品久久久久久久久久白浆 | 一级黄片毛片 | 婷婷综合激情 | 四虎影视亚洲精品一区二区 | 50一60岁老妇女毛片 | 国产免费又黄又爽又刺激蜜月al | 精品一区二区三区免费视频 | 日韩资源在线观看 | 波多野结衣视频一区 | 麻豆疯狂做受xxxx高潮视频 | 亚州欧洲日韩精品 | 性一交一乱一伧国产女士spa | 国产精品夫妻视频 | 无码无套少妇毛多69xxx | 久久久久国产精品嫩草影院 | 亚洲人成久久 | 亚洲爆乳无码专区www | 国产在线视频资源 | 久久久久久久爱 | 亚洲免费在线视频 | 性欧美18-19sex性高清播放 | www..com18午夜观看| 男女爽爽无遮挡午夜视频 | 女同hd系列中文字幕 | 国产一区二区三区成人欧美日韩在线观看 | 日日操网站 | 18精品久久久无码午夜福利 | 中文字字幕人妻中文 | 久久精品国产日本波多野结衣 | 欧美美女性视频 | 牛牛精品一区二区 | 中文在线中文资源 | 亚洲精品一区二三区不卡 | 2018亚洲男人天堂 | 天天综合国产 | 亚洲精品自在在线观看 | 亚洲日本aⅴ片在线观看香蕉 | 成年在线视频 | 亚洲经典av | 午夜免费在线观看 | 国产精品久免费的黄网站 | 国产区精品在线观看 | 夜夜揉揉日日人人 | 欧美成人视 | 日本一区二区三区日本免费 | 日韩少妇内射免费播放18禁裸乳 | 亚洲熟妇色xxxxx欧美老妇y | 老司机在线精品视频 | 免费看黄色毛片 | 亚洲综合图区 | 免费日韩毛片 | 天天综合欧美 | 欧洲成人一区 | 欧美精品区 | 国产午夜大地久久 | 91麻豆影院 | 精品日韩一区二区 | 国产另类在线 | 午夜欧美精品久久久久久久 | 粉嫩粉嫩一区性色av片 | 九九视频网 | 久久男人av资源网站 | 精品人伦一区二区三区蜜桃免费 | 伊人资源 | 日韩av在线免费观看 | 国产乱码av | 久久er99热精品一区二区 | 色噜噜狠狠色综合网图区 | 超碰在线成人 | 国产av一区二区三区无码野战 | 毛片在线播放a | 成人免费mmmmm视频 | 黄色片在线免费观看视频 | 国内精品久久久久久久久 | 视色av| 色婷婷91 | 欧美二区乱c黑人 | 国产zzjjzzjj视频全免费 | 国产视频一区二区三区在线观看 | 欧美俄罗斯乱妇 | 91视频在线视频 | 亚洲a成人片在线观看 | 荡女精品导航 | 国产99久久久久久免费看农村 | 亚洲最大av资源站无码av网址 | 久久国产免费 | 91精品久久天干天天天按摩 | 精品一区二区在线播放 | 国产成人av综合色 | 亚洲成a人v欧美综合天堂 | 亚洲国产精品婷婷 | 青青在线免费观看 | 人妻少妇久久中文字幕一区二区 | 婷婷爱五月 | 国产精品欧美久久久久天天影视 | 国产肉体xxxx裸体137大胆 | 亚洲国产av无码精品 | 污视频免费在线 | 91av小视频 | 91夫妻在线 | 韩国成人免费视频 | 亚洲精品乱码一区二区三区 | 无码天堂va亚洲va在线va | 日韩高清国产一区在线 | 国内自拍区 | 色女仆影院 | 亚洲一线在线观看 | av中文字幕免费观看 | 日本肥妇毛片在线xxxxx | 久久国产香蕉 | 国产精品老热丝在线观看 | 亚洲精品久久久久999中文字幕 | 国产美女久久久亚洲综合 | 精品国产精品国产偷麻豆 | 亚洲伦理在线观看 | 天天色天天射天天干 | 377p欧洲日本亚洲大胆噜噜 | 一级黄色片视频 | 四虎影视大全 | 亚洲深夜 | 五月丁香综合缴情六月小说 | 久久99精品久久久久久青青日本 | 奇米影视第四色888 奇米影视久久 | 思思久久96热在精品国产 | 欧美人与性禽动交情品 | 欧亚av在线| 欧美另类变人与禽xxxxx | 亚洲性影院 | 欧美成人精品一区二区三区在线看 | 精品麻豆av| 少妇把腿扒开让我爽爽视频 | 久久cao| 先锋影音av资源在线观看 | 毛片网站在线播放 | av片免费观看 | 久久久久久久麻豆 | 欧美日韩综合一区二区三区 |