Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android輕量型數據庫sqlite的使用方法匯總

android輕量型數據庫sqlite的使用方法匯總

編輯:關於Android編程

聲明:主要是對sqlite的使用做一下簡單的匯總。

首先建立數據庫和建立數據表

[html] 
/** 
 * @FILE:DBOpenHelper.java 
 * @AUTHOR:Administrator 
 * @DATE:2013-5-14 下午10:06:29 
 **/ 
package com.yehui.service; 
 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
 
/******************************************* 
 *  
 * @CLASS:DBOpenHelper 
 * @DESCRIPTION:sqlite數據庫必須繼承SQLiteOpenHelper(抽象類) 
 * @AUTHOR:Administrator 
 * @VERSION:v1.0 
 * @DATE:2013-5-14 下午10:06:29 
 *******************************************/ 
public class DBOpenHelper extends SQLiteOpenHelper { 
 
    /** 
     * create a instance DBOpenHelper. 
     *  
     * @param context 
     *            上下文對象 
     * @param name 
     *            數據庫名稱 
     * @param factory 
     *            CursorFactory 
     * @param version 
     *            版本號(第一次生成數據庫時,版本號是1,只執行一次) 
     */ 
    public DBOpenHelper(Context context) { 
        super(context, "yehui.db", null, 1); 
 
    } 
 
    /* 
     * (non-Javadoc)當創建數據庫的時候就會創建下面的表,可以在這裡創建多張表:表中的字段的類型可以完全沒有, 
     * varchar(20)長度並不能限制。可以輸入超過20字符的長度。 
     *  
     * @see 
     * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite 
     * .SQLiteDatabase) 
     */ 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
        String sql = "create table person(personid integer primary key autoincrement, name varchar(20))"; 
        // 執行這句sql 
        db.execSQL(sql); 
    } 
 
    /* 
     * (non-Javadoc)對數據庫更新,可以在這個方法裡面對數據表做alter.:也就是說當 super(context, "yehui.db", 
     * null, 1);這裡面的版本號發生改變的時候就會調用這個方法,執行完成後將數據庫的版本號設置為新的版本號 
     *  
     * @see 
     * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite 
     * .SQLiteDatabase, int, int) 
     */ 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
        String sql = "ALTER TABLE PERSON ADD PHONE VARCHAR(12) NULL"; 
        db.execSQL(sql); 
    } 
 

/**
 * @FILE:DBOpenHelper.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午10:06:29
 **/
package com.yehui.service;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

/*******************************************
 *
 * @CLASS:DBOpenHelper
 * @DESCRIPTION:sqlite數據庫必須繼承SQLiteOpenHelper(抽象類)
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午10:06:29
 *******************************************/
public class DBOpenHelper extends SQLiteOpenHelper {

 /**
  * create a instance DBOpenHelper.
  *
  * @param context
  *            上下文對象
  * @param name
  *            數據庫名稱
  * @param factory
  *            CursorFactory
  * @param version
  *            版本號(第一次生成數據庫時,版本號是1,只執行一次)
  */
 public DBOpenHelper(Context context) {
  super(context, "yehui.db", null, 1);

 }

 /*
  * (non-Javadoc)當創建數據庫的時候就會創建下面的表,可以在這裡創建多張表:表中的字段的類型可以完全沒有,
  * varchar(20)長度並不能限制。可以輸入超過20字符的長度。
  *
  * @see
  * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite
  * .SQLiteDatabase)
  */
 @Override
 public void onCreate(SQLiteDatabase db) {
  String sql = "create table person(personid integer primary key autoincrement, name varchar(20))";
  // 執行這句sql
  db.execSQL(sql);
 }

 /*
  * (non-Javadoc)對數據庫更新,可以在這個方法裡面對數據表做alter.:也就是說當 super(context, "yehui.db",
  * null, 1);這裡面的版本號發生改變的時候就會調用這個方法,執行完成後將數據庫的版本號設置為新的版本號
  *
  * @see
  * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite
  * .SQLiteDatabase, int, int)
  */
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  String sql = "ALTER TABLE PERSON ADD PHONE VARCHAR(12) NULL";
  db.execSQL(sql);
 }

}
其次,為了方法建立一個bean來對應表中的內容:


[html] 
/** 
 * @FILE:Person.java 
 * @AUTHOR:Administrator 
 * @DATE:2013-5-14 下午10:31:18 
 **/ 
package com.yehui.entity; 
 
/******************************************* 
 *  
 * @CLASS:Person 
 * @DESCRIPTION:bean 
 * @AUTHOR:Administrator 
 * @VERSION:v1.0 
 * @DATE:2013-5-14 下午10:31:18 
 *******************************************/ 
public class Person { 
    private Integer id; 
    private String name; 
    private String phone; 
 
    public Person(String name, String phone) { 
        this.name = name; 
        this.phone = phone; 
    } 
 
    public Person(Integer id, String name, String phone) { 
        super(); 
        this.id = id; 
        this.name = name; 
        this.phone = phone; 
    } 
 
    public Person() { 
        super(); 
    } 
 
    @Override 
    public String toString() { 
        return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]"; 
    } 
 
    public Integer getId() { 
        return id; 
    } 
 
    public void setId(Integer id) { 
        this.id = id; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public String getPhone() { 
        return phone; 
    } 
 
    public void setPhone(String phone) { 
        this.phone = phone; 
    } 
 
    public static void main(String[] args) { 
        Person person = new Person("yehui", "132"); 
        System.out.println(person.toString()); 
    } 

/**
 * @FILE:Person.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午10:31:18
 **/
package com.yehui.entity;

/*******************************************
 *
 * @CLASS:Person
 * @DESCRIPTION:bean
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午10:31:18
 *******************************************/
public class Person {
 private Integer id;
 private String name;
 private String phone;

 public Person(String name, String phone) {
  this.name = name;
  this.phone = phone;
 }

 public Person(Integer id, String name, String phone) {
  super();
  this.id = id;
  this.name = name;
  this.phone = phone;
 }

 public Person() {
  super();
 }

 @Override
 public String toString() {
  return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]";
 }

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getPhone() {
  return phone;
 }

 public void setPhone(String phone) {
  this.phone = phone;
 }

 public static void main(String[] args) {
  Person person = new Person("yehui", "132");
  System.out.println(person.toString());
 }
}
再次:建立一個service類來處理業務邏輯(注意兩種不同的操作方法使用sql的不同)


[html] view plaincopyprint?
/** 
 * @FILE:PersonService.java 
 * @AUTHOR:Administrator 
 * @DATE:2013-5-14 下午10:41:47 
 **/ 
package com.yehui.service; 
 
import java.util.ArrayList; 
import java.util.List; 
 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.util.Log; 
 
import com.yehui.entity.Person; 
 
/******************************************* 
 *  
 * @CLASS:PersonService 
 * @DESCRIPTION:對person進行增刪改查操作 
 * @AUTHOR:Administrator 
 * @VERSION:v1.0 
 * @DATE:2013-5-14 下午10:41:47 
 *******************************************/ 
public class PersonService { 
    private DBOpenHelper dbOpenHelper; 
    public final static String TAG = "PersonService"; 
 
    /** 
     * create a instance PersonService. 會創建數據庫 
     *  
     * @param context 
     */ 
    public PersonService(Context context) { 
        super(); 
        this.dbOpenHelper = new DBOpenHelper(context); 
    } 
 
    /** 
     * @description:保存 
     * @author:Administrator 
     * @return:void 
     * @param person 
     */ 
 
    public void save(Person person) { 
        // 如果數據表不存在先創建數據表,存在,則不創建 
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
        // SQLiteDatabase db1 = dbOpenHelper.getWritableDatabase();這個和 
        // SQLiteDatabase db是同一個對象 
        // 方法1 
        // 使用?。參數形式 
        // db.execSQL("insert into person(name,phone) values(?,?)", new Object[] 
        // { 
        // person.getName(), person.getPhone() }); 
        // 或者使用sqlite自帶的操作方法 
        // 方法2 
        ContentValues values = new ContentValues(); 
        values.put("name", person.getName()); 
        values.put("phone", person.getPhone()); 
        db.insert("person", null, values); 
        // 注意這裡的第二個參數(表的字段名)。db.insert("person", "personid", 
        // null);也就說新增一條紀錄,id是null:這個語句不會報錯,只會按自增的id新增一條紀錄 
    } 
 
    /** 
     * @description:按照id刪除數據 
     * @author:Administrator 
     * @return:void 
     * @param id 
     */ 
 
    public void delete(Integer id) { 
        // 如果數據表不存在先創建數據表,存在,則不創建 
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
        // 方法1 
        // 使用?。參數形式 
        // db.execSQL("delete from person where personid=?", new Object[] { id 
        // }); 
        // 方法2 
        db.delete("person", "personid=?", new String[] { id.toString() }); 
    } 
 
    public void update(Person person) { 
        // 如果數據表不存在先創建數據表,存在,則不創建 
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 
        // 方法1 
        // 使用?。參數形式 
        // db.execSQL("update  person set name=?,phone=? where personid=? ", new 
        // Object[] { person.getName(),person.getPhone(),person.getPersonid() 
        // }); 
        // 方法2 
        ContentValues values = new ContentValues(); 
        values.put("name", person.getName()); 
        values.put("phone", person.getPhone()); 
        db.update("person", values, "personid=?", new String[] { person.getId() 
                .toString() }); 
    } 
 
    /** 
     * @description:依照id查找數據 
     * @author:Administrator 
     * @return:Person 
     * @param id 
     * @return 
     */ 
 
    public Person find(Integer id) { 
        Person person = null; 
        // 如果數據表不存在先調用getReadableDatabase方法,存在,則不創建 
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); 
        // 方法1 
        // 使用?。參數形式 
        // Cursor cursor = db.rawQuery("select * from person where personid=?", 
        // new String[] { id.toString() }); 
        // 方法2 
        Cursor cursor = db.query("person", null, "personid=?", 
                new String[] { id.toString() }, null, null, null); 
        // 如果找到一個result,則返回result 
        if (cursor.moveToFirst()) { 
            person = new Person(); 
            person.setId(cursor.getColumnIndex("personid")); 
            person.setName(cursor.getString(cursor.getColumnIndex("name"))); 
            person.setPhone(cursor.getString(cursor.getColumnIndex("phone"))); 
        } 
        Log.v(TAG, person.toString()); 
        cursor.close(); 
        return person; 
    } 
 
    /** 
     * @description:分頁查詢 
     * @author:Administrator 
     * @return:List<Person> 結果 
     * @param offset 
     *            跳過幾條數據 
     * @param maxResult 
     *            總共查找幾條數據 
     * @return 
     */ 
 
    public List<Person> getScrollData(Integer offset, int maxResult) { 
        List<Person> persons = new ArrayList<Person>(); 
        // 如果數據表不存在先調用getReadableDatabase方法,存在,則不創建 
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); 
        // 方法1 
        // 使用?。參數形式 
        // Cursor cursor = db.rawQuery( 
        // "select * from person order by personid asc limit ?,?", 
        // new String[] { String.valueOf(offset), 
        // String.valueOf(maxResult) }); 
        // 方法2 
        Cursor cursor = db.query("person", null, null, null, null, null, 
                "personid asc", offset + "," + maxResult); 
        // 循環將結果加入到list中 
        while (cursor.moveToNext()) { 
            Person person = new Person(); 
            person.setId(cursor.getColumnIndex("personid")); 
            person.setName(cursor.getString(cursor.getColumnIndex("name"))); 
            person.setPhone(cursor.getString(cursor.getColumnIndex("phone"))); 
            persons.add(person); 
        } 
        cursor.close(); 
        // Log.v(TAG, person.toString()); 
        return persons; 
    } 
 
    /** 
     * @description:獲得紀錄的總數 
     * @author:Administrator 
     * @return:long 
     * @return 
     */ 
 
    public long getCount() { 
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); 
        // 方法1 
        // Cursor cursor = db.rawQuery("select count(*) from person", null); 
        // 方法2 
        Cursor cursor = db.query("person", new String[] { "count('*')" }, null, 
                null, null, null, null, null); 
        cursor.moveToFirst(); 
        // 取得第一個字段的所有記錄數 
        long count = cursor.getLong(0); 
        cursor.close(); 
        Log.v(TAG, "紀錄總數" + count); 
        return count; 
    } 

/**
 * @FILE:PersonService.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午10:41:47
 **/
package com.yehui.service;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.yehui.entity.Person;

/*******************************************
 *
 * @CLASS:PersonService
 * @DESCRIPTION:對person進行增刪改查操作
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午10:41:47
 *******************************************/
public class PersonService {
 private DBOpenHelper dbOpenHelper;
 public final static String TAG = "PersonService";

 /**
  * create a instance PersonService. 會創建數據庫
  *
  * @param context
  */
 public PersonService(Context context) {
  super();
  this.dbOpenHelper = new DBOpenHelper(context);
 }

 /**
  * @description:保存
  * @author:Administrator
  * @return:void
  * @param person
  */

 public void save(Person person) {
  // 如果數據表不存在先創建數據表,存在,則不創建
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  // SQLiteDatabase db1 = dbOpenHelper.getWritableDatabase();這個和
  // SQLiteDatabase db是同一個對象
  // 方法1
  // 使用?。參數形式
  // db.execSQL("insert into person(name,phone) values(?,?)", new Object[]
  // {
  // person.getName(), person.getPhone() });
  // 或者使用sqlite自帶的操作方法
  // 方法2
  ContentValues values = new ContentValues();
  values.put("name", person.getName());
  values.put("phone", person.getPhone());
  db.insert("person", null, values);
  // 注意這裡的第二個參數(表的字段名)。db.insert("person", "personid",
  // null);也就說新增一條紀錄,id是null:這個語句不會報錯,只會按自增的id新增一條紀錄
 }

 /**
  * @description:按照id刪除數據
  * @author:Administrator
  * @return:void
  * @param id
  */

 public void delete(Integer id) {
  // 如果數據表不存在先創建數據表,存在,則不創建
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  // 方法1
  // 使用?。參數形式
  // db.execSQL("delete from person where personid=?", new Object[] { id
  // });
  // 方法2
  db.delete("person", "personid=?", new String[] { id.toString() });
 }

 public void update(Person person) {
  // 如果數據表不存在先創建數據表,存在,則不創建
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
  // 方法1
  // 使用?。參數形式
  // db.execSQL("update  person set name=?,phone=? where personid=? ", new
  // Object[] { person.getName(),person.getPhone(),person.getPersonid()
  // });
  // 方法2
  ContentValues values = new ContentValues();
  values.put("name", person.getName());
  values.put("phone", person.getPhone());
  db.update("person", values, "personid=?", new String[] { person.getId()
    .toString() });
 }

 /**
  * @description:依照id查找數據
  * @author:Administrator
  * @return:Person
  * @param id
  * @return
  */

 public Person find(Integer id) {
  Person person = null;
  // 如果數據表不存在先調用getReadableDatabase方法,存在,則不創建
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  // 方法1
  // 使用?。參數形式
  // Cursor cursor = db.rawQuery("select * from person where personid=?",
  // new String[] { id.toString() });
  // 方法2
  Cursor cursor = db.query("person", null, "personid=?",
    new String[] { id.toString() }, null, null, null);
  // 如果找到一個result,則返回result
  if (cursor.moveToFirst()) {
   person = new Person();
   person.setId(cursor.getColumnIndex("personid"));
   person.setName(cursor.getString(cursor.getColumnIndex("name")));
   person.setPhone(cursor.getString(cursor.getColumnIndex("phone")));
  }
  Log.v(TAG, person.toString());
  cursor.close();
  return person;
 }

 /**
  * @description:分頁查詢
  * @author:Administrator
  * @return:List<Person> 結果
  * @param offset
  *            跳過幾條數據
  * @param maxResult
  *            總共查找幾條數據
  * @return
  */

 public List<Person> getScrollData(Integer offset, int maxResult) {
  List<Person> persons = new ArrayList<Person>();
  // 如果數據表不存在先調用getReadableDatabase方法,存在,則不創建
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  // 方法1
  // 使用?。參數形式
  // Cursor cursor = db.rawQuery(
  // "select * from person order by personid asc limit ?,?",
  // new String[] { String.valueOf(offset),
  // String.valueOf(maxResult) });
  // 方法2
  Cursor cursor = db.query("person", null, null, null, null, null,
    "personid asc", offset + "," + maxResult);
  // 循環將結果加入到list中
  while (cursor.moveToNext()) {
   Person person = new Person();
   person.setId(cursor.getColumnIndex("personid"));
   person.setName(cursor.getString(cursor.getColumnIndex("name")));
   person.setPhone(cursor.getString(cursor.getColumnIndex("phone")));
   persons.add(person);
  }
  cursor.close();
  // Log.v(TAG, person.toString());
  return persons;
 }

 /**
  * @description:獲得紀錄的總數
  * @author:Administrator
  * @return:long
  * @return
  */

 public long getCount() {
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
  // 方法1
  // Cursor cursor = db.rawQuery("select count(*) from person", null);
  // 方法2
  Cursor cursor = db.query("person", new String[] { "count('*')" }, null,
    null, null, null, null, null);
  cursor.moveToFirst();
  // 取得第一個字段的所有記錄數
  long count = cursor.getLong(0);
  cursor.close();
  Log.v(TAG, "紀錄總數" + count);
  return count;
 }
}

最後使用單元測試來測試功能:


[html] view plaincopyprint?
/** 
 * @FILE:DBTest.java 
 * @AUTHOR:Administrator 
 * @DATE:2013-5-14 下午11:52:06 
 **/ 
package com.yehui.db; 
 
import java.util.List; 
 
import android.app.Activity; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.test.AndroidTestCase; 
import android.view.Menu; 
 
import com.yehui.entity.Person; 
import com.yehui.service.DBOpenHelper; 
import com.yehui.service.PersonService; 
 
/******************************************* 
 *  
 * @CLASS:DBTest 
 * @DESCRIPTION:sqlite單元測試必須繼承AndroidTestCase 
 * @AUTHOR:Administrator 
 * @VERSION:v1.0 
 * @DATE:2013-5-14 下午11:52:06 
 *******************************************/ 
public class DBTest extends AndroidTestCase  { 
    private DBOpenHelper dbOpenHelper; 
    private SQLiteDatabase sqliteDatabase; 
    public void createDB() { 
        dbOpenHelper = new DBOpenHelper(this.getContext()); 
        // 創建數據表 
        sqliteDatabase = dbOpenHelper.getWritableDatabase(); 
    } 
 
    public void save() { 
        PersonService personService = new PersonService( 
                this.getContext()); 
        Person person = new Person("zhangxueyou", "123456"); 
        personService.save(person); 
    } 
 
    public void delete() { 
        PersonService personService = new PersonService( 
                this.getContext()); 
        personService.delete(2); 
    } 
 
    public void update() { 
        PersonService personService = new PersonService( 
                this.getContext()); 
        Person person = personService.find(1); 
        person.setName("guofucheng"); 
        personService.update(person); 
    } 
 
    public Person find() { 
        PersonService personService = new PersonService( 
                this.getContext()); 
        Person person = personService.find(1); 
        return person; 
    } 
 
    public List<Person> getScrollData() { 
        PersonService personService = new PersonService( 
                this.getContext()); 
        List<Person> persons = personService.getScrollData(0, 2); 
        return persons; 
    } 
 
    public long getCount() { 
        PersonService personService = new PersonService( 
                this.getContext()); 
        long count = personService.getCount(); 
        return count; 
    } 

/**
 * @FILE:DBTest.java
 * @AUTHOR:Administrator
 * @DATE:2013-5-14 下午11:52:06
 **/
package com.yehui.db;

import java.util.List;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.test.AndroidTestCase;
import android.view.Menu;

import com.yehui.entity.Person;
import com.yehui.service.DBOpenHelper;
import com.yehui.service.PersonService;

/*******************************************
 *
 * @CLASS:DBTest
 * @DESCRIPTION:sqlite單元測試必須繼承AndroidTestCase
 * @AUTHOR:Administrator
 * @VERSION:v1.0
 * @DATE:2013-5-14 下午11:52:06
 *******************************************/
public class DBTest extends AndroidTestCase  {
 private DBOpenHelper dbOpenHelper;
 private SQLiteDatabase sqliteDatabase;
 public void createDB() {
  dbOpenHelper = new DBOpenHelper(this.getContext());
  // 創建數據表
  sqliteDatabase = dbOpenHelper.getWritableDatabase();
 }

 public void save() {
  PersonService personService = new PersonService(
    this.getContext());
  Person person = new Person("zhangxueyou", "123456");
  personService.save(person);
 }

 public void delete() {
  PersonService personService = new PersonService(
    this.getContext());
  personService.delete(2);
 }

 public void update() {
  PersonService personService = new PersonService(
    this.getContext());
  Person person = personService.find(1);
  person.setName("guofucheng");
  personService.update(person);
 }

 public Person find() {
  PersonService personService = new PersonService(
    this.getContext());
  Person person = personService.find(1);
  return person;
 }

 public List<Person> getScrollData() {
  PersonService personService = new PersonService(
    this.getContext());
  List<Person> persons = personService.getScrollData(0, 2);
  return persons;
 }

 public long getCount() {
  PersonService personService = new PersonService(
    this.getContext());
  long count = personService.getCount();
  return count;
 }
}

好了,總結就這麼多了。

 


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved