Android應用效能最佳化之使用SQLiteStatement最佳化SQLite操作

來源:互聯網
上載者:User

標籤:

平常在做Android資料庫操作時,都是用的execSQL之個方法. 今天偶然發現了SQLiteStatement這個類.讓我想起了在做Java Web開發寫JDBC的代碼時Prestatement這個類.Prestatement不僅提高了效率,也解決了SQL注入的問題.那在Android中的SQLiteStatement,是否也會提高一些效率呢?

於是寫了一個簡單的測試,比較execSQL和SQLiteStatement的executeInsert方法插入1000條資料所需要的時間.都沒有使用事物.

 

建立一個資料庫和users表:

public class DBHelper extends SQLiteOpenHelper {    private static final String DB_NAME = "userdb";    private static final int DB_VERSION = 1;    public DBHelper(Context context) {        super(context, DB_NAME, null, DB_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        StringBuffer sql = new StringBuffer();        sql.append("create table users");        sql.append("(_id int PRIMARY KEY,name varchar,gender int,age int,phoneNumber varchar,address varchar)");        db.execSQL(sql.toString());    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

然後分別使用SQLiteDatabase 的execSQL方法和SQLiteStatement的executeInsert方法進入插入, 比較執行所需要的時間:

public class UserDao {    private DBHelper dbHelper;    private SQLiteDatabase db;    private StringBuffer sql_insert;    private List<User> users;    public UserDao(Context context){        this.dbHelper = new DBHelper(context);        this.db = dbHelper.getWritableDatabase();        sql_insert = new StringBuffer();        sql_insert.append("INSERT INTO users(name,gender,age,phoneNumber,address) ");        sql_insert.append(" VALUES( ?, ?, ?, ?, ?)");        users = new ArrayList<User>();        //測試資料        for(int i = 0;i<1000;i++){            User user = new User();            user.setId(i);            user.setName("name"+i);            user.setGender(0);            user.setAge(user.getRandomAge());            user.setPhoneNumber("13800138000");            user.setAddress("GuangDong ShenZhen No."+i);            users.add(user);        }    }    /**     * 使用SQLiteDatabase 的execSQL方法插入資料      * @return 返回執行所需要的時間     */    public long insertexecSQL()    {        long start=System.currentTimeMillis();        for(User user:users){            Object[] bindArgs = {user.getName(),user.getGender(),user.getAge(),user.getPhoneNumber(),user.getAddress()};            db.execSQL(sql_insert.toString(),bindArgs);        }        long end = System.currentTimeMillis();        return end - start;    }    /**     * 使用SQLiteStatement的executeInsert方法插入資料     * @return 返回執行所需要的時間     */    public long insertStatement()    {        long start = System.currentTimeMillis();        for(User user:users){        SQLiteStatement statement=    db.compileStatement(sql_insert.toString());        statement.bindString(1, user.getName());        statement.bindLong(2, user.getGender());        statement.bindLong(3, user.getAge());        statement.bindString(4, user.getPhoneNumber());        statement.bindString(5, user.getAddress());        statement.executeInsert();        }        long end = System.currentTimeMillis();        return end - start;    }}

介面方面就兩個按鈕,分別調用不同的插入方法, 並將執行所需的時間顯示在Button上.

public class MainActivity extends Activity {    private Button btn1;    private Button btn2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final UserDao dao = new UserDao(this);        btn1 = (Button) findViewById(R.id.btn1);        btn2 = (Button) findViewById(R.id.btn2);        btn1.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                btn1.setText(String.valueOf(dao.insertexecSQL()));            }        });        btn2.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                btn2.setText(String.valueOf(dao.insertStatement()));            }        });    }}

通過幾次比較發現,插入1000條資料,使用SQLiteStatement的executeInsert方法一般比使用SQLiteDatabase 的execSQL方法快5秒左右.這個差距還是很大的.

需要說明的是,上面的兩個方法我們都沒有開啟事物.在進行這樣的大量操作時,開啟事物肯定會很大程度上提高效率.

db.beginTransaction();xxxx….db.setTransactionSuccessful();db.endTransaction();

還有一個需要注意的問題是,在批量插入1000條資料的時候,並沒用使用非同步類或新的線程.我發現介面明顯會出現停頓的現象.如果插入更大數量的資料時,會直接停止回應.

所以,在進行資料操作的時候, 如果資料量較大, 建議使用非同步類或開啟新的線程.

 

本文轉自:http://liuzhichao.com/p/1664.html

Android應用效能最佳化之使用SQLiteStatement最佳化SQLite操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.