Android數據存儲之SQLite使用

SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數據庫引擎。它支持大多數的SQL92標準,而且能夠在全部主要的操做系統上運行。html

在Android中建立的SQLite數據庫存儲在:/data/data/<包名>/databases/目錄下。sql

主要特色:數據庫

-輕量級數據結構

-獨立性,沒有不依賴,無需安裝ide

-跨平臺,支持衆多操做系統工具

-支持高達2TB大小的數據庫this

-每一個數據庫以單個文件的形式存在url

-以B-Tree的數據結構形式存儲在硬盤spa

SQLite的數據類型:操作系統

SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數據類型

分別表明:空值、整型值、浮點值、字符串值、二進制對象。

動態數據類型(弱引用):

當某個值插入到數據庫中時,SQLite將會檢測它的數據類型,若是該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,若是不能轉換,則該值將做爲自己的類型存儲。

在Android中使用SQLite主要涉及兩個類:

SQLiteDatabaseSQLiteOpenHelper,下面對這兩個類進行主要的分析。

SQLiteDatabase

這個類提供了一些管理SQLite數據庫的方法,好比建立、刪除、執行SQL命令,和執行其餘常見的數據庫管理任務的方法。每一個程序的數據庫名字是惟一的。

經常使用方法:

db.execSQL(String sql) //執行任何的SQL語句

db.insert(String table,String nullColumnHack,ContentValues values) //插入記錄

db.delete(String table,String whereClause,String[] whereArgs)//刪除記錄

db.update(String table,ContentValues values,String whereClause,String[] whereArgs)//更新記錄

db.query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)//查詢記錄

db.rawQuery(String sql,String[] selectionArgs)//經過sql語句查詢記錄

下面是一個簡單操做SQLite數據庫的示例:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //每一個程序都有本身的數據庫 //經過openOrCreateDatabase來打開或建立一個數據庫,返回SQLiteDatabase對象
        /** * openOrCreateDatabase(String name,int mode,SQLiteDatabase.CursorFactory factory) * name: 數據庫名 * mode: 數據庫權限,MODE_PRIVATE爲本應用程序私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE分別爲全局可讀和可寫。 * factory: 能夠用來實例化一個cusor對象的工廠類 */ SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null); //建立一個表
        db.execSQL("create table if not exists userTb (" +
                    "_id integer primary key," +
                    "name text not null,age integer not null," +
                    "sex text not null)"); //向表中插入記錄
        db.execSQL("insert into userTb (name,age,sex) values ('張三',18,'女')"); db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')"); db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')"); //Cursor爲查詢結果對象,相似於JDBC中的ResultSet
        Cursor queryResult = db.rawQuery("select * from userTb", null); if (queryResult != null) { while (queryResult.moveToNext()) { Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id")) + " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name")) + " 年齡: " + queryResult.getInt(queryResult.getColumnIndex("age")) + " 性別: " + queryResult.getString(queryResult.getColumnIndex("sex"))); } //關閉遊標對象
 queryResult.close(); } //關閉數據庫
 db.close(); } }

當執行完openOrCreateDatabase("user.db",MODE_PRIVATE,null)後,會在/data/data/<包名>/databases/目錄下建立一個數據庫文件,打開DDMS能夠查看。也能夠將其導出,使用navigate等工具打開查看裏面的數據。

另外,上述示例對記錄的操做是使用execSQL()方法經過原生的SQL語句進行的,固然也可使用上面介紹的SQLiteDatabase經常使用的方法來操做,如insert()、delete()、update()、query()等方法。可是須要注意的是,以插入記錄舉例,當數據量不大時,經過execSQL()使用SQL語句進行插入與使用insert()方法插入記錄的效率是差很少的,可是若是數據量比較大,那麼使用前者比使用後者的效率明顯高出不少。

SQLiteOpenHelper

這個類爲SQLiteDatabase的幫助類,主要用於管理數據庫的建立與版本更新。SQLiteHelper是一個抽象類,通常經過建立一個繼承自它的子類並重寫onCreat()和onUpgrade()方法進行使用。

-onCreat(SQLiteDatabase db) //首次建立數據庫時調用,通常用於建表等操做。

-onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)//當升級數據庫版本時調用

下面是使用SQLiteOpenHelper的一個簡單示例:

建立一個繼承自SQLiteOpenHelper的子類

public class SQLiteHelper extends SQLiteOpenHelper { /** * context:上下文對象 * name:數據庫名 */
    public SQLiteHelper(Context context, String name) { super(context, name, null, 1); } //首次建立數據庫的時候調用,通常進行建表或某些初始化的操做
 @Override public void onCreate(SQLiteDatabase db) { //建表
        db.execSQL("create table if not exists userTb (" +
                "_id integer primary key," +
                "name text not null,age integer not null," +
                "sex text not null)"); } //當數據庫版本升級時自動調用
 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

而後就能夠經過SQLiteHelper的實例獲取一個SQLiteDatabase對象,進而對數據庫進行一系列的操做了。

public class MainActivity2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //建立一個SQLiteHelper對象
        SQLiteHelper helper = new SQLiteHelper(MainActivity2.this,"stu.db"); //使用getWritableDatabase()或getReadableDatabase()方法得到SQLiteDatabase對象
        SQLiteDatabase db = helper.getWritableDatabase(); //插入記錄
        db.execSQL("insert into userTb (name,age,sex) values ('張三',18,'女')"); db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')"); db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')"); //獲取遊標對象
        Cursor queryResult = db.rawQuery("select * from userTb", null); if (queryResult != null) { //打印全部記錄
            while (queryResult.moveToNext()) { Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id")) + " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name")) + " 年齡: " + queryResult.getInt(queryResult.getColumnIndex("age")) + " 性別: " + queryResult.getString(queryResult.getColumnIndex("sex"))); } //關閉遊標對象
 queryResult.close(); } //關閉數據庫
 db.close(); } }
做者: caobotao
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索