日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android平台db4o使用示例

發(fā)布時(shí)間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android平台db4o使用示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

db4o是一個純對象的數(shù)據(jù)庫,現(xiàn)支持java和.NET。07年的時(shí)候,db4objects宣布db4o已可以順利運(yùn)行于Android平臺,當(dāng)時(shí)db4objects公司和db4o的愛好者積極推進(jìn)db4o運(yùn)行于Google Android平臺,以期待讓db4o成為Android上的首選數(shù)據(jù)庫平臺,但令人遺憾的是google最后選擇了sqlite作為作為android平臺的數(shù)據(jù)庫。但是沒有關(guān)系,db4objects有相應(yīng)的解決方案,db4o可以無縫的運(yùn)行于Android。

相對于關(guān)系型數(shù)據(jù)庫,db4o還顯得很年輕。大家對關(guān)系型數(shù)據(jù)庫的理念根深蒂固,所以一時(shí)很難理解對象型數(shù)據(jù)庫的理論。現(xiàn)在的數(shù)據(jù)庫課程也都是以關(guān)系型數(shù)據(jù)庫為示例,對象型數(shù)據(jù)庫都是作為一個新興的數(shù)據(jù)庫一筆帶過。這也導(dǎo)致很多人缺乏對象型數(shù)據(jù)的理論知識。真的想用好db4o,對象型數(shù)據(jù)的理論知識是必不可少的。例如對象型數(shù)據(jù)是沒有主鍵這個概念的,這會讓大多數(shù)人難以適應(yīng)。

db4o也發(fā)展了幾年了,到現(xiàn)在好多人還不知道,網(wǎng)上的資料比較少,也是比較老的版本。現(xiàn)在主流的android應(yīng)用也都是使用sqlite數(shù)據(jù)庫,這肯定是有原因的。這倒不是性能上的問題。Db4o的速度不見得會比關(guān)系型數(shù)據(jù)庫慢。其最大的問題在于理解數(shù)據(jù)對象的關(guān)系和操作。db4o沒有看上去那么簡單,說實(shí)在的,我現(xiàn)在好多東西還沒搞明白。比如:

class A {int id;String name;List<B> list; }

存儲這種結(jié)構(gòu)的對象,我一直搞不明白A和B的關(guān)聯(lián)情況。對應(yīng)一些大應(yīng)用還是建議使用比較成熟的東西。Android平臺上大家倒是可以一試,我也分享下自己的學(xué)習(xí)成果。現(xiàn)在db4o最新是8.x。穩(wěn)定版本是7.x。本人以7.x演示。要說的是android平臺需要的db4o的jar要1M多(8.x版的要1.4M左右,網(wǎng)上說的400k應(yīng)該是很早的版本了,官網(wǎng)上找不到了)。db4o的官網(wǎng)下載地址http://community.versant.com/Downloads/db4o.aspx。對應(yīng)android開發(fā)只需要核心jar包db4o-7.x-core-java5.jar。在下載的壓縮包里還有一個db4o數(shù)據(jù)庫的視圖工具OME(ObjectManager Enterprise),這是一個eclipse插件,是一個離線的安裝包。


Db4o的操作流程很簡單:打開數(shù)據(jù)庫文件,通過DAO讀寫數(shù)據(jù),最后關(guān)閉數(shù)據(jù)庫,支持事務(wù)和并發(fā)。

作為對象型數(shù)據(jù)庫是不用寫sql的,這點(diǎn)很爽。

?

對于db4o的基本操作不再多說,可以參考文章最后的參考鏈接。我做了一些封裝,并使用泛型來減少Dao的創(chuàng)建。如果不使用本例的泛型的話,你需要對每個bean創(chuàng)建Dao,如UserDao、CacheDao。在關(guān)系型數(shù)據(jù)庫中我們通過主鍵來識別一條記錄,但是對象型數(shù)據(jù)庫中沒有記錄,只有對象。db4o通過序列化java對象并存入文件,它識別是這個還是那個對象用的不是主鍵,而是UUID,這個UUID只有當(dāng)一個對象被存入數(shù)據(jù)庫中才會被分配到,未存入數(shù)據(jù)庫的對象是沒有UUID的,所以說我們并不能通過UUID來更新一條數(shù)據(jù).那怎樣更新一條數(shù)據(jù)?我們只能是先將這個對象查出來,然后修改內(nèi)容再存入,或者查詢到直接刪除,然后存入新對象.

Db.java

package com.sljm.lfa.store;import java.io.Serializable; import java.util.ArrayList; import java.util.List;import com.db4o.Db4oEmbedded; import com.db4o.ObjectContainer; import com.db4o.ObjectSet; import com.db4o.config.CommonConfiguration; import com.db4o.config.EmbeddedConfiguration; import com.db4o.query.Query;/*** @author SunnyCoffee* @date 2013-9-7* @version 1.0* @desc DB配置和操作接口*/ public class Db<T extends Serializable> {private Class<T> clazz;private String unique;private static ObjectContainer db;/*** 這里的unique是class里作為索引的屬性* * @param clazz* @param unique*/public Db(Class<T> clazz, String unique) {this.clazz = clazz;this.unique = unique;}// 打開數(shù)據(jù)庫private ObjectContainer getDb() {if (db == null || db.ext().isClosed()) {db = Db4oEmbedded.openFile(conf(), getDbPath());}return db;}private String getDbPath() {return "/mnt/sdcard/lfa.db4o";// 數(shù)據(jù)庫文件的路徑}// 數(shù)據(jù)庫的參數(shù)配置. 數(shù)據(jù)庫配置并沒有存儲到文件,每次打開數(shù)據(jù)庫執(zhí)行此方法進(jìn)行配置private EmbeddedConfiguration conf() {EmbeddedConfiguration conf = Db4oEmbedded.newConfiguration();CommonConfiguration common = conf.common();if (unique != null) {common.objectClass(clazz).objectField(unique).indexed(true);}common.objectClass(clazz).cascadeOnUpdate(true);common.objectClass(clazz).cascadeOnActivate(true);return conf;}/*** 存儲對象* * @param obj*/public void store(T obj) {if (obj == null) {return;}getDb().store(obj);}public void store(List<T> list) {if (list == null) {return;}for (T t : list) {getDb().store(t);}}/*** 刪除對象* * @param obj*/public void delete(T obj) {if (obj == null) {return;}getDb().delete(obj);}public void delete(List<T> list) {if (list == null) {return;}for (T t : list) {getDb().delete(t);}}/*** 查詢所有的某一對象* * @return*/public List<T> queryAll() {Query query = getDb().query();query.constrain(clazz);query.descend(unique).orderAscending();ObjectSet<T> set = query.execute();List<T> list = fromObjectSet(set);return list;}/*** 根據(jù)id查詢一個對象* * @param field* 字段* @param id* 字段的值* @return*/public T queryById(Object id) {List<T> list = queryWhere(unique, id);if (list.size() == 0) {return null;}return list.get(0);}public List<T> queryWhere(String field, Object value) {Query query = getDb().query();query.constrain(clazz);query.descend(field).constrain(value);ObjectSet<T> set = query.execute();List<T> list = fromObjectSet(set);return list;}public void close() {getDb().commit();if (db != null) {db.close();db = null;}}private List<T> fromObjectSet(ObjectSet<T> set) {List<T> list = new ArrayList<T>();while (set.hasNext()) {list.add(set.next());}return list;} }

db4o有3種查詢方式,官方一直推薦NQ(Native Queries),也就是原生查詢.首先它是類型安全的,其次查詢支持本地語言。還有就是QBE(Query by Example)和SODA(Simple Object Database Access)。QBE沒有用過,似乎沒什么特點(diǎn)。SODA的是最低層的查詢方式,速度快、靈活性高,不足之處就是非類型安全的。本例中因?yàn)橛信判虿僮?考慮效率和易用性上使用了SODA。

DbApiImpl.java

package com.sljm.lfa.store;import java.util.List;import com.sljm.lfa.bean.Cache;/*** @author SunnyCoffee* @date 2013-10-22* @version 1.0* @desc 數(shù)據(jù)庫接口實(shí)現(xiàn)類,查詢使用SODA。 NQ查詢更安全,考慮到效率和簡單使用了SODA,* 如此一來必須使用字符串來表示字段,如果javaBean變動這里字段必須做調(diào)整*/ public class DbApiImpl implements DbApi {public Cache getCacheById(final String id) {Db<Cache> db = new Db<Cache>(Cache.class, "id");Cache cache = db.queryById(id);db.close();return cache;}public void updateCache(Cache cache) {Db<Cache> db = new Db<Cache>(Cache.class, "id");Cache c = db.queryById(cache.getId());db.delete(c);db.store(cache);db.close();}public void clearCache() {Db<Cache> db = new Db<Cache>(Cache.class, "id");List<Cache> list = db.queryAll();db.delete(list);db.close();} }


這里注意兩點(diǎn)一個是Serializable接口,一個是空構(gòu)造方法。

Cache.java

package com.sljm.lfa.bean;import java.io.Serializable;/*** @author SunnyCoffee* @create 2013-8-21* @version 1.0* @desc 緩存bean*/ public class Cache implements Serializable {/*** */private static final long serialVersionUID = 1L;private String id;private long lastModified;private long valid;private Object result;public Cache() {}// set and get }


參考鏈接:

http://www.ibm.com/developerworks/cn/java/j-db4o/

http://www.db4o.com

總結(jié)

以上是生活随笔為你收集整理的android平台db4o使用示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲四区 | 国产欧美精品国产国产专区 | 久久精品一二三区 | 欧美精品在欧美一区二区 | 国产欧美精品一区 | 亚洲精品1区| av日韩一区二区三区 | 久久22| 精品国产一区二 | www夜片内射视频日韩精品成人 | 亚洲综合p | 韩国伦理中文字幕 | 欧美性天天影院 | cao在线视频 | 波多野结衣日韩 | 69xxx国产| 制中文字幕音影 | 香蕉婷婷 | 国产制服丝袜 | 久久婷婷国产麻豆91天堂 | 国产精品白嫩极品美女 | 午夜看毛片 | 大又大又粗又硬又爽少妇毛片 | 日韩国产一区二区三区 | 欧美成人资源 | 久久综合国产精品 | 久久精品免费播放 | 国产成人在线一区二区 | 人妻与黑人一区二区三区 | 91成人在线观看喷潮动漫 | 男女av在线| 91九色国产在线 | 99久久99九九99九九九 | 国产午夜片| 黄网免费观看 | 男女做爰猛烈吃奶啪啪喷水网站 | jizz成熟丰满日本少妇 | 韩国中文字幕在线观看 | 人人草人人爽 | 成年人91视频 | 91麻豆精品91久久久久同性 | 午夜在线影院 | 国产精品成人自拍 | 四虎一区二区 | 亚洲影视一区二区 | 成人做爰66片免费看网站 | 天堂中文网 | 亚洲成a人片77777kkkk | 欧美性色19p| 黄色亚洲视频 | 福利在线电影 | 午夜伦伦电影理论片费看 | 一级黄色免费毛片 | 中文字幕第一页在线播放 | 亚洲精品在线视频观看 | 日本二区视频 | 黑人三级视频 | 91中文字日产乱幕4区 | 日韩美女免费视频 | 蜜乳av一区二区三区 | 久久大 | 免费黄色网址在线 | www.youjizz.com日本 | 激情小说综合 | 91调教打屁股xxxx网站 | wwwxxx日本免费 | 永久免费AV无码网站韩国毛片 | 国产精品一区二区入口九绯色 | 午夜激情视频在线播放 | 久久久久久婷 | 99久久久无码国产精品不卡 | 久久av在线 | 青青伊人av | 天天干,天天操 | 久久精品国产亚洲av无码娇色 | 日韩国产三级 | 亚洲国产无码久久 | 波多野结衣av无码 | 日本亲与子乱xxx | 九九热视频在线免费观看 | 5级黄色片 | 国产美女引诱水电工 | 九色蝌蚪视频 | 狠狠搞av| 天堂成人在线 | 丰满熟妇肥白一区二区在线 | 91精品国产色综合久久不卡电影 | 白俄罗斯毛片 | 国产福利免费观看 | 亚洲综合久久av一区二区三区 | 夜夜骑夜夜骑 | 欧美日韩国产电影 | 午夜少妇福利 | 九一天堂 | 国产做爰全免费的视频软件 | 99热国产| 欧美大片黄| 不卡av免费观看 | 男人操女人逼逼视频 |