android 數(shù)據(jù)庫SQLite realm

一俊扳、SQLite

android內(nèi)置了數(shù)據(jù)庫SQLite途蒋,這是一款輕量級的關(guān)系型數(shù)據(jù)庫,通常只需要幾百K的內(nèi)存馋记。數(shù)據(jù)庫文件存放在/data/data/<package name>/databases/目錄下号坡。
為了方便管理數(shù)據(jù)庫,可以使用抽象類SQLiteOpenHelper抗果。其中onCreate和onUpgrade這兩個抽象方法必須要重寫筋帖。注意,如果數(shù)據(jù)庫已經(jīng)存在冤馏,onCreate方法不會再執(zhí)行日麸,也就是只會在創(chuàng)建時執(zhí)行一次。在構(gòu)造參數(shù)中,如果傳入的版本號比之前的大代箭,就會去執(zhí)行onUpgrade方法墩划。如下代碼中,如果用戶新安裝嗡综,會創(chuàng)建onCreate中的兩個表乙帮。如果是覆蓋安裝,就會執(zhí)行onUpgrade中的方法极景。
getWritableDatabase和getReadableDatabase方法都會返回一個SQLiteDatabase對象察净,借助它就可以實現(xiàn)CURD操作。
<pre>
public class MyDatabaseHelper extends SQLiteOpenHelper{
public static final String CREATE_BOOK = "create table Book("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real"
+ "pages integer"
+ "name text)";
private Context context;

public MyDatabaseHelper(Context context,String name,CursorFactory factory,int version){
super(context,name,factory,version);
mContext = context;
}

public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_BOOK);//第1版
db.execSQL(CREATE_CATEGORY);//第2版追加表
}

public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
switch(oldVersion){
case 1:
db.execSQL(CREATE_CATEGORY);
case 2:
db...
}
//注意switch中沒有break盼樟,這是為了跨版本升級時氢卡,每個版本的更新都會順序執(zhí)行到。
}
}

...
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
SQLiteDatabase db = dbHelper.getWritableDatabase();

//以下為增加方法
ContentValues values = new ContentValues();
//組裝第一條數(shù)據(jù) id不用組裝
values.put("name","The da Vinci");
values.put("author","Dan");
values.put("pages",454);
values.put("price",16.96);
db.insert("Book",null,values);//第一個參數(shù)是表名

values.clear();
values.put("name","The da Vinciw");
values.put("author","Danw");
values.put("pages",54);
values.put("price",6.96);
db.insert("Book",null,values);

//以下為更新方法
values.put("price",10.99);
db.update("Book",values,"name=?",new String[]{"the davinci code"});

//以下為刪除方法
db.delete("Book","pages>?",new String[]{"500"});

//以下為查詢方法
Cursor cursor = db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
do{
//遍歷cursor對象
String name = cursor.getString(cursor.getColoumnIndex("name"));
String author = cursor.getString(cursor.getColoumnIndex("author"));
int pages = cursor.getInt(cursor.getColoumnIndex("pages"));
double price = cursor.getDouble(cursor.getColoumnIndex("price"));
...
}while(cursor.moveToNext());
}
cursor.close();

//以下使用事務
db.begintranscation();//開啟事務
try{
db.delete...
db.insert...
db.setTranscationSuccessful();//事務成功
}catch(Exception e){
e.printStackTrace();
}finally{
db.endTransaction();//結(jié)束事務
}
</pre>

二晨缴、realm

參考
Realm Java的學習译秦、應用、總結(jié)
Realm 的初探
Android Realm數(shù)據(jù)庫完美解析
在Android加入和使用Realm
官方文檔

當我們的app有數(shù)據(jù)需要保存到本地緩存時击碗,可以使用file筑悴,sharedpreferences,還有sqlite稍途。sharedpreferences其實使用xml的方式阁吝,以鍵值對形式存儲基本數(shù)據(jù)類型的數(shù)據(jù)。對于有復雜篩選查詢的操作晰房,file和sharedpreferences都不能滿足了求摇。sqlite可以滿足有大量復雜查詢要求的緩存數(shù)據(jù)操作射沟。但是sqlite的使用略復雜殊者,代碼量很大,還好網(wǎng)上有很多優(yōu)秀的orm框架可使用验夯,比如ORMlite猖吴,greenDao等。
ORMlite挥转,greenDao這些框架都是在SQLite的基礎上封裝的ORM對象關(guān)系映射框架海蔽,簡化了代碼操作。而今天的主角:Realm是一個可以替代SQLite以及ORM Libraries的輕量級數(shù)據(jù)庫绑谣。相比SQLite党窜,Realm更快并且具有很多現(xiàn)代數(shù)據(jù)庫的特性,比如支持JSON借宵,流式api幌衣,數(shù)據(jù)變更通知,以及加密支持,這些都為安卓開發(fā)者帶來了方便豁护。

** 1.realm**
一個 Realm 相當于一個 SQLite 數(shù)據(jù)庫哼凯。它有一個與之對應的文件,一旦創(chuàng)建將持久保存在安卓的文件系統(tǒng)中楚里。要創(chuàng)建一個新的 Realm断部,你可以在任意 Activity 中調(diào)用靜態(tài)方法 Realm.getInstance 。
Realm realm = Realm.getInstance(context);
注意班缎,調(diào)用 Realm.getInstance蝴光,而沒有傳入RealmConfiguration,會創(chuàng)建一個叫做 default.realm 的 Realm 文件达址。如果你想向app中添加另一個 Realm虱疏,必須使用一個 RealmConfiguration.Builder 對象,并為 Realm 文件指定一個獨有的名字苏携。

Realm realm = Realm.getInstance(
  new RealmConfiguration.Builder(context)
      .name("data.realm")
      .build()
);

2.model:
如果需要存儲某個對象到 Realm里面 做瞪, 只要繼承了RealmObject類。比如右冻,下面這個類的實例就能輕松的存儲在一個Realm中:

public class User extends RealmObject {

  private String          name;
  private int             age;
  private int             sessionId;

// Standard getters & setters generated by your IDE…
  public String getName() { return name; }
  public void   setName(String name) { this.name =   name; }
  public int    getAge() { return age; }
  public void   setAge(int age) { this.age = age; }
  public int    getSessionId() { return sessionId; }
  public void   setSessionId(int sessionId) { this.sessionId = sessionId; }
}

3.操作

//這是存儲數(shù)據(jù)的方法
realm.beginTransaction();

User user = realm.createObject(User.class); 
user .setName("XXX");
user .setAge(11);
user .getSessionId(1123);

realm.commitTransaction();
//再來看看查詢的方法

RealmResults<User> user =
    realm.where(User.class).findAll();
//findAll 可以遍歷出所有存儲的對象并返回装蓬,如果需要添加查詢,可以加上其他方法纱扭。

RealmResults<User> user =
    realm.where(User.class)
            .greaterThan("age", 10)
            .findAll();
//上面的代碼演示了如何使用greaterThan方法來獲取age 大于 10 的數(shù)據(jù)牍帚。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乳蛾,隨后出現(xiàn)的幾起案子暗赶,更是在濱河造成了極大的恐慌,老刑警劉巖肃叶,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹂随,死亡現(xiàn)場離奇詭異,居然都是意外死亡因惭,警方通過查閱死者的電腦和手機岳锁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹦魔,“玉大人激率,你說我怎么就攤上這事∥鹁觯” “怎么了乒躺?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長低缩。 經(jīng)常有香客問我嘉冒,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任健爬,我火速辦了婚禮控乾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娜遵。我一直安慰自己蜕衡,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布设拟。 她就那樣靜靜地躺著慨仿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纳胧。 梳的紋絲不亂的頭發(fā)上镰吆,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音跑慕,去河邊找鬼万皿。 笑死,一個胖子當著我的面吹牛核行,可吹牛的內(nèi)容都是我干的牢硅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芝雪,長吁一口氣:“原來是場噩夢啊……” “哼减余!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惩系,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤位岔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后堡牡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抒抬,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年悴侵,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞧剖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡可免,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出做粤,到底是詐尸還是另有隱情浇借,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布怕品,位于F島的核電站妇垢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闯估,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一灼舍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涨薪,春花似錦骑素、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侠姑,卻和暖如春创橄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莽红。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工妥畏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人安吁。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓咖熟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柳畔。 傳聞我的和親對象是個殘疾皇子际邻,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容