Android數據存儲之SQLite使用

jopen 8年前發布 | 16K 次閱讀 SQLite Android 數據庫服務器

SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數據庫引擎。它支持大多數的SQL92標準,并且可以在所有主要的操作系統上運行。

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

主要特點:

-輕量級

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

-跨平臺,支持眾多操作系統

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

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

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

SQLite的數據類型:

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

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

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

當某個值插入到數據庫中時,SQLite將會檢測它的數據類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作為本身的類型存儲。

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

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

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();
    }
}

來自: http://www.cnblogs.com/caobotao/p/5118463.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!