亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Android SQLite使用

2024-07-21 02:53:08
字體:
來源:轉載
供稿:網友

數據庫是Android的一種數據存儲方式,但是SQLiteOpenHelper是抽象類,我們需要自己寫一個實現類來實現onCreate方法和onUpgrade方法,這兩個方法分別會在數據庫創建和更新的時候調用到。

getWritableDatabase方法和getReadableDatabase方法分別返回一個可寫的數據庫和一個可讀的數據庫。如果發現數據庫不存在,就會調用onCreate方法創建一個數據庫,如果版本號升級就調用onUpgrade升級數據庫。創建的數據庫在/data/data/xxx(package)/xxx.dbSQLiteOpenHelper:如下是一個SQLiteOpenHelper的實現類,創建的時候生成兩張表,更新的時候生成一張表。
package com.example.sql.sql;import android.content.Context;import android.database.DatabaseErrorHandler;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;/** * Created by hongbin on 17-3-6. */public class MyOpenHelper extends SQLiteOpenHelper {    //數據庫版本號    PRivate static final int DATABASE_VERSION = 1;    //數據庫名    private static final String DATABASE_NAME = "Test.db";    //數據庫表名    public static final String[] TABLE_NAMES = {"TABLE_0", "TABLE_1", "TABLE_2"};    public MyOpenHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);        Log.d("dbLog","MyOpenHelper");    }    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {        super(context, name, factory, version, errorHandler);    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        Log.d("dbLog","onCreate");        //創建表一語句        StringBuffer sBuffer0 = new StringBuffer();        sBuffer0.append("CREATE TABLE [" + TABLE_NAMES[0] + "] (");        sBuffer0.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ");        sBuffer0.append("[name] TEXT,");        sBuffer0.append("[age] INTEGER,");        //創建表二語句        StringBuffer sBuffer1 = new StringBuffer();        sBuffer1.append("CREATE TABLE [" + TABLE_NAMES[1] + "] (");        sBuffer1.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ");        sBuffer1.append("[name] TEXT,");        sBuffer1.append("[age] INTEGER,");        // 執行SQL語句        sqLiteDatabase.execSQL(sBuffer0.toString());        sqLiteDatabase.execSQL(sBuffer1.toString());    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {        Log.d("dbLog","onUpgrade");        StringBuffer sBuffer3 = new StringBuffer();        sBuffer3.append("CREATE TABLE [" + TABLE_NAMES[2] + "] (");        sBuffer3.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ");        sBuffer3.append("[name] TEXT,");        sBuffer3.append("[age] INTEGER,");        sqLiteDatabase.execSQL(sBuffer3.toString());    }}Activity:
public class MainActivity extends AppCompatActivity {    private MyOpenHelper myOpenHelper;    private SQLiteDatabase db;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myOpenHelper = new MyOpenHelper(this);        //獲取一個可寫的數據庫,如果不存在就創建,如果版本更新就升級        Log.d("dbLog","getWritableDatabase");        db = myOpenHelper.getWritableDatabase();    }}Log:

從以上日志可以發現數據庫創建和升級的流程。

創建之后對數據庫的增刪改查可以用execSQL來執行SQL語句,也可以分別用insert、delete、update、query來執行。

批量處理

在數據庫的使用過程中,常常需要一次性操作大量的數據,如果用循環一次一次的操作肯定是很消耗事件的,這時候我們就需要用到開啟一個事務來做批處理。做個實驗驗證一下一次性插入5000條數據的時間消耗。

public void onClick(View view) {                int i = 0;                String sql = "INSERT INTO %s VALUES (null, %s, %s)";                try {                    Log.d("dbLog","非批處理");                    Log.d("dbLog","start");                    while(i < 5000){                        db.execSQL(String.format(sql,MyOpenHelper.TABLE_NAMES[0],i,i));                        i++;                    }                } catch (Exception e) {                    e.printStackTrace();                } finally {                    Log.d("dbLog","finish");                    Log.d("dbLog","插入" + i + "條數據");                }            }

//----------------------------------我是一條分割線------------------------------------//

public void onClick(View view) {                int i = 0;                String sql = "INSERT INTO %s VALUES (null, %s, %s)";                try {                    Log.d("dbLog","批處理");                    Log.d("dbLog","start");                    db.beginTransaction();                    while(i < 5000){                        db.execSQL(String.format(sql,MyOpenHelper.TABLE_NAMES[1],i,i));                        i++;                    }                    db.setTransactionSuccessful();                } catch (Exception e) {                    e.printStackTrace();                } finally {                    db.endTransaction();                    Log.d("dbLog","finish");                    Log.d("dbLog","插入" + i + "條數據");                }            }

不采用事務來執行人5000次的插入操作,從日志中可以看到,start到finish的時間差是34.53秒。

而采用事務來執行人5000次的插入操作,從日志中可以看到,start到finish的時間差是1.16秒。

這里的性能差別真是太大啦。

我們都知道磁盤的讀寫是很耗時的,簡單來說,每一次的插入都是一個事務,執行5000插入操作相當于執行了5000次的磁盤讀寫,而采用事務包裝的話就把5000次的插入操作當作一次事務,也就是一次磁盤讀寫,時間上當然相差很大啦。

數據庫的知識太多了,這里就簡單描述一下Android SQLite最基礎的操作。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老女人xx| 久久精品国产久精国产一老狼| 欧美视频免费在线| 久久影视电视剧免费网站| 久久精品国产成人精品| 韩国精品美女www爽爽爽视频| 久久久久久亚洲精品不卡| 亚洲网在线观看| 欧美日韩亚洲视频一区| 欧美猛交免费看| 日韩av在线影视| 全亚洲最色的网站在线观看| 亚洲乱亚洲乱妇无码| 亚洲国产精品久久久久秋霞不卡| 欧美大学生性色视频| 亚洲国产欧美一区二区三区久久| y97精品国产97久久久久久| 国产成人精品免高潮在线观看| 国产成+人+综合+亚洲欧美丁香花| 欧美电影免费播放| 欧美成aaa人片在线观看蜜臀| 日韩专区在线观看| 97在线观看视频| 97热在线精品视频在线观看| 麻豆国产精品va在线观看不卡| 亚洲全黄一级网站| 国自产精品手机在线观看视频| 成人性生交大片免费观看嘿嘿视频| 亚洲第一视频网站| 亚洲天堂色网站| 亲爱的老师9免费观看全集电视剧| 黑人精品xxx一区一二区| 欧美一区二区三区免费观看| 亚洲国产精品久久久久秋霞不卡| 一区二区三欧美| 亚洲欧美综合精品久久成人| 亚洲精品白浆高清久久久久久| 久久精品人人做人人爽| 精品久久久久久电影| 日韩在线高清视频| 国产精品综合网站| 视频直播国产精品| 视频在线一区二区| 亚洲欧美中文日韩在线v日本| 日韩精品中文字幕在线观看| 中文字幕亚洲专区| 国产偷亚洲偷欧美偷精品| 国产亚洲欧美日韩一区二区| 欧美极品少妇xxxxx| 久久精品夜夜夜夜夜久久| 亚洲精品一区二区在线| 欧美日韩国产一区在线| 欧美日韩国产精品一区| 欧美成年人在线观看| 亚洲精品自拍偷拍| 亚洲精品国产精品国自产观看浪潮| 亚洲精品国产综合区久久久久久久| 久久久国产91| 亚洲国产成人爱av在线播放| 亚洲第一av在线| 国产亚洲人成网站在线观看| 欧美主播福利视频| 97色在线视频| 欧美一级bbbbb性bbbb喷潮片| 欧美日韩精品二区| 亚洲男人天堂2019| 欧美一区亚洲一区| 国产日韩欧美视频| 亚洲人成网7777777国产| 色在人av网站天堂精品| 国产成人精品av在线| 欧美日韩不卡合集视频| 久久91精品国产91久久跳| 国产色综合天天综合网| 亚洲va欧美va在线观看| 久久精品一偷一偷国产| 海角国产乱辈乱精品视频| 久久亚洲精品小早川怜子66| 最近日韩中文字幕中文| 久久久av一区| 成人网在线观看| 国产精品视频最多的网站| 高潮白浆女日韩av免费看| 国产精选久久久久久| 国产亚洲精品久久久久久777| 国产精品6699| 97香蕉超级碰碰久久免费软件| 亚洲人精选亚洲人成在线| 97香蕉久久夜色精品国产| 国产a级全部精品| 精品国内亚洲在观看18黄| 91国产精品电影| 疯狂做受xxxx高潮欧美日本| 国产成人午夜视频网址| 国产精品444| 欧美二区在线播放| 青青草99啪国产免费| 国产国语videosex另类| 亚洲最大的网站| 日韩在线欧美在线国产在线| 色狠狠av一区二区三区香蕉蜜桃| 国产91精品久久久久久| 中文字幕国内精品| 欧美亚洲另类视频| 亚洲a成v人在线观看| 亚洲va欧美va国产综合久久| 久久香蕉国产线看观看网| 国产成人精品电影久久久| 久久国产精品久久久久久久久久| 午夜精品一区二区三区在线| 色综合老司机第九色激情| 国产精品中文久久久久久久| 国产一区二区日韩| 69精品小视频| 亚洲美女久久久| 欧美一级淫片丝袜脚交| 亚洲欧洲一区二区三区久久| 国产裸体写真av一区二区| 精品视频久久久| 亚洲第一精品夜夜躁人人爽| 综合av色偷偷网| 国产精品69精品一区二区三区| 亚洲色图日韩av| 久久久国产精品视频| 欧美精品免费在线| 亚洲人午夜色婷婷| 日韩在线观看视频免费| 中文字幕日韩电影| 亚洲色在线视频| 欧美专区日韩视频| 欧美在线视频在线播放完整版免费观看| 色999日韩欧美国产| 欧美日韩国产二区| 亚洲欧美日本精品| 色狠狠久久aa北条麻妃| 国产男女猛烈无遮挡91| 亚洲国产成人一区| 国产精品吊钟奶在线| 国产精品69久久| 欧美日韩视频免费播放| 欧美成aaa人片免费看| 日韩经典中文字幕| 亚洲深夜福利在线| 亚洲国产欧美久久| 国产精品久久久久久中文字| 精品久久久久久久久久久久久久| 久久激情视频久久| 国产精品美女视频网站| 精品动漫一区二区三区| 黑人精品xxx一区一二区| 精品中文字幕在线2019| 57pao成人国产永久免费| 成人a在线观看| 成人国产精品av| 日韩av黄色在线观看| 国语自产精品视频在免费| 亚洲成人久久久| 国产精品视频999| 草民午夜欧美限制a级福利片| 亚洲日本欧美中文幕| 国产精品网站入口| 欧美最近摘花xxxx摘花| 亚洲乱码av中文一区二区| 亚洲激情视频在线播放|