⑴ 單realm的作用和多realm的區別
單realm的作用和多realm的區別在於是否涉及認證策略。
現在很多應用都是要兼顧iOS和Android兩個平台同時開發。如果兩個平台都能使用相同的資料庫,那就不用考慮內部數據的架構不同,使用Realm提供的API,可以使數據持久化層在兩個平台上無差異化的轉換。
CoreData和SQLite冗餘、繁雜的知識和代碼足以嚇退絕大多數剛入門的開發者,而換用Realm,則可以極大地減少學習成本,立即學會本地化存儲的方法。
毫不吹噓的說,把官方最新文檔完整看一遍,就完全可以上手開發了。
Realm還提供了一個輕量級的資料庫查看工具,在MacAppstore可以下載RealmBrowser這個工具,開發者可以查看資料庫當中的內容,執行簡單的插入和刪除數據的操作。畢竟,很多時候,開發者使用資料庫的理由是因為要提供一些所謂的「知識庫」。
⑵ shiro配置 如何修改數據表名
自定義Realm,自己實現查詢資料庫的代碼,自己指定表名。
⑶ 怎樣看待 Realm 這個移動資料庫
說一下個人在開發中遇到的一些小坑...
1.RealmObject自帶線程保護功能,只能在創建它的線程中訪問,在子線程中不能訪問。
也就是說,如果你在主線程中new了一個RealmObject對象 user,那麼在子線程中是訪問不了user對象的。
要想在子線程中訪問,必須先將user存入Ream中,然後在子線程中query出來。
2.如果Realm關閉,所有查詢得到的RealmObject都不能使用了。
如果想在子線程中去查詢數據,然後在主線程中使用是無法做到的。所以Realm提供的非同步查詢就很重要了...
3.如果想在Realm.close()之後繼續操作查詢得到的對象,只能復制一份數據傳出來。
為防止Realm忘記關閉,個人喜歡將Realm的開啟和關閉封裝在一個函數中。
但是realm Colse掉之後,query得到對象就不能訪問了,所以只能復制一份數據傳出來。
這個比較坑,Realm開發者是為了它的一個特色功能Auto-Update,即自動更新查詢到的數據,
特意讓查詢得到的數據與資料庫中的數據保持了同步,所以Realm一關,外面的數據也用不了。
而且,這個Auto-update暫時還無法關閉,stackOverFlow上有說以後可能會提供關閉這個功能的方法。
如果你的RealmObject非常復雜,要一份數據將會很麻煩...
而且這還不是最坑的,最坑的是下面這條。
4.如果直接修改或刪除query得到的數據,必須在transaction中完成...
也就是說,你根本不能把query返回的對象,當成普通對象去賦值或刪除,如果想要直接操作...ok,把對象一份傳出來...
⑷ Realm要存儲的類的屬性有枚舉型要怎麼修改(swift)
枚舉聲明可以顯式地聲明 byte、sbyte、short、ushort、int、uint、long 或 ulong 類型作為對應的基礎類型。沒有顯式地聲明基礎類型的枚舉聲明意味著所對應的基礎類型是 int。 在枚舉類型中聲明的第一個枚舉成員它的默值為零。 以後的枚舉成員值是將前一個枚舉成員(按照文本順序)的值加 1 得到的。
⑸ 如何從Realm資料庫Android中刪除對象
首先,的刪除資料庫某一列的值分幾種情況:
不刪除欄位,只更新其專中的內容
在資料庫中其屬實叫做更新(update)
語句如下:
update 表 set 欄位=null
2、刪除欄位
alter table 表 drop column 欄位
⑹ 怎樣看待 Realm 這個移動資料庫
說一下個人在開發中遇到的一些小坑... 1.RealmObject自帶線程保護功能,只能在創建它的線程中訪問,在子線程中不能訪問。 也就是說,如果你在主線程中new了一個RealmObject對象 user,那麼在子線程中是訪問不了user對象的。
⑺ 怎樣看待 Realm 這個移動資料庫
下面是5個可用ORM的總體介紹:
1. OrmLite
OrmLite 不是 Android 平台專用的ORM框架,它是Java ORM。支持JDBC連接,Spring以及Android平台。語法中廣泛使用了註解(Annotation)。
2. SugarORM
SugarORM 是 Android 平台專用ORM。提供簡單易學的APIs。可以很容易的處理1對1和1對多的關系型數據,並通過3個函數save(), delete() 和 find() (或者 findById()) 來簡化CRUD基本操作。
要啟用SugarORM,需要在你的應用程序 AndroidManifest.xml 配置中添加如下meta-data標簽:
<meta-data android:name="DATABASE" android:value="my_database.db" />
<meta-data android:name="VERSION" android:value="1" />
<meta-data android:name="QUERY_LOG" android:value="true" />
<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.my-domain" />
然後就可以從SugarORM擴展需要保存的數據類:
public class User extends SugarRecord<User> {
String username;
String password;
int age;
@Ignore
String bio; //this will be ignored by SugarORM
public User() { }
public User(String username, String password,int age){
this.username = username;
this.password = password;
this.age = age;
}
}
要添加一個User,代碼如下:
User johndoe = new User(getContext(),"john.doe","secret",19);
johndoe.save(); //stores the new user into the database
3. GreenDAO
當性能很重要時(數據訪問頻繁),GreenDao是一個很快的解決方案,它能夠支持數千條記錄的CRUD每秒,和OrmLite相比,GreenDAO要快幾乎4.5倍。(准確數據請自行benchmark)。
GreenDAO小於100KB,所以對於應用程序APK的大小影響很小。
這里有一個教程,演示如何使用Android Studio,在Android應用程序中使用GreenDAO框架。
4. Active Android
Active Record(活動目錄)是Yii、Rails等框架中對ORM實現的典型命名方式。Active Android 幫助你以面向對象的方式來操作SQLite。
5. Realm
Realm 是一個將可以使用的Android ORM,基於C++編寫,直接運行在你的設備硬體上(不需要被解釋),因此運行很快。它同時是開源跨平台的,iOS的代碼可以在GitHub找到,你還可以找到Objective C以及Swift編寫的Realm使用實例。
⑻ android上有PropertyUtils的替代品嗎
Realm是一個開源的面向對象移動資料庫。上個月,Realm的Android版本發布了,比iOS版本晚了三個月。
我們之前已經報道過,Realm沒有使用SQLite作為它的引擎,而是用C++寫了自己的引擎,他們的目標是提供一個聚焦移動領域的SQLite的替代者。現在它的Android版本已經發布了。
當前Android上的Realm的API和iOS版本有點不同,這也反映了Objective C和Java的差別。Java版本的API有更高的強類型(strong-typed)要求,也更連貫(fluent)。
比如,在iOS上,查詢是通過靜態方法如"objectWhere"來進行的,這將返回一個RLMArray。這里的謂詞都是基於字元串的。以下就是基於Object C的查詢方法:
RLMArray *tanDogs = [Dog objectsWhere:@"color = 'tan' AND name BEGINSWITH 'B'"];
另一方面,在Android下進行相同的查詢卻是這樣的:
RealmResults<Dog> tanDogs = realm.where(Dog.class)
.equalTo("color", "tan")
.beginsWith("name", "B")
.findAll();
當然,這有可能會被一種跨iOS、Android和其他平台的文本查詢語言所替代。Tim Anglade是Realm的產品主管,他在一封郵件中指出,未來API的發展方向很大程度取決於社區的反饋。
雖然Realm是一個面向對象的資料庫,但它和其他同類產品還是有一些明顯的不同。Tim解釋道,當它用原生對象格式(native object format)來存儲數據時,這些對象不會帶著其語言特有的格式原封不動地存在磁碟上,而是通過C++引擎存儲在一個全局的表中。這使得Realm可以通過各種語言來訪問數據,還包括各種即時查詢(adhoc query)。
相比關系資料庫,這種混合了對象和表的方式的優勢在於它使圖查詢(graph query)更高效——甚至在相對老舊的智能手機上,查詢深度嵌套的對象圖也不會影響系統反應速度。Realm發布的基準測試(benchmark)結果稱,在普通操作上,Realm的速度最快要達到原始的SQLite的10倍。
如果你現在有一個應用程序使用CoreData(iOS上)或SQLite(Android上),並且想遷移到Realm,肯定有一些事要做。這不是隨便拿來就能用的——Tim解釋說,CoreData和SQLite傾向於使用一種非常標准化的形式,這種做法在Realm上行不通。你最好從對象的角度重新思考你的模式(schema)和模型(model)。
一旦你修改了你的模式,使之適用於Realm,接下來把現有數據從CoreData/SQLite遷移過來就簡單了。只要配置一次遷移操作(從Realm資料庫版本0到版本1),在遷移過程中,把你的SQLite數據載入到Realm對象中並保存它們。
或者,如果你的數據保存在遠程伺服器上,你可以從頭新建Realm資料庫。
在採用Realm之前,必須要考慮到它是一個最前沿的軟體,這意味著將來它的API有可能做出和以前不兼容的修改。
你可以通過Android版本的Realm來了解更多,或者查看Github上的代碼。
⑼ 怎樣看待 Realm 這個移動資料庫
首先說說優點:
API簡單,光速上手(然後光速踩坑,APP狂閃不止)。這個確實是小團隊福音,不需要學習曲線陡峭的CoreData,甚至不用寫sql,大家簡單閱讀下文檔,就可以在實際項目中開用了。升級、遷移等都有非常成熟的介面。
性能優秀。簡單看過原理,相比於傳統資料庫 鏈接 - 查詢 - 命中 - 內存拷貝 - 對象序列化 的復雜過程,Realm採用基於內存映射的Zero-Copy技術,速度快一個數量級。而且內部採用了類似git的對象版本管理機制,並發的性能和安全性也不錯。
響應式。Realm的查詢結果是隨資料庫變化實時更新的(要求對象在Run Loop線程中),配合KVO或者Realm自帶的ObjectNotification,可以輕松構建及時反映數據變化的響應式UI,這點和目前主流的響應式框架(ReactNative,ReactiveCocoa)應該是天作之和了。但是要求使用者改變思路,不然會出現很多詭異的bug。
ORM。雖然Realm自己號稱是『為移動開發者定製的全功能資料庫』,但是其中確實包含ORM的很多特性,不用手動寫中間層了,取出來就是新鮮活潑的對象,everyone is happy。
再說說坑:
無法多線程共享資料庫對象。這是Realm設計的要求,跨線程訪問的話,只能自己重新query出來。前面說的上手快,踩坑也快,就是因為這個:非同步的Block、網路介面的回調、從不同線程發出的通知都會觸發這個訪問異常。最關鍵的還是思維方式的轉換,Realm其實是要求盡量減少object的傳遞,雖然是ORM,但畢竟還是是個資料庫,該query的地方,還是不要偷懶。
資料庫對象管理。這里有很多坑,比如訪問一個被刪除的對象時,會直接異常;資料庫被close後,所有查詢出的object都無法使用;修改被管理對象屬性,必須在指定block或者資料庫事物集中完成,相當於入庫,但是一般的對象又沒有關系(兩者看起來沒有任何區別)等等等等。
對業務代碼的侵蝕嚴重。所有的的資料庫對象要繼承指定的類(沒法繼承自己的基類了),增刪改查,對查詢結果處理都有特殊的語法要求,這使得在舊項目中引入Realm或者放棄使用將Realm從項目中剝離都面臨很大的成本。
靜態庫大,還在不斷更新。引入這樣一個三方靜態庫會增加App體積,目測大了1M至少了。另外Realm目前還不是很穩定,之前測試ObjectNotification功能,居然會出現偶爾拿不到回調的bug,相比於成熟的sqlite方案,還不是很放心。
總體來說,Realm還是一個值得嘗試的存儲方案,個人非常看好 Realm + Swift + reactiveCocoa或者Realm + ReactNative的組合,總感覺和Objective-C八字不合。
⑽ 怎樣看待 Realm 這個移動資料庫
1. OrmLite
OrmLite 不是 Android 平台專用的ORM框架,它是Java ORM。支持JDBC連接,Spring以及Android平台。語法中廣泛使用了註解(Annotation)。
2. SugarORM
SugarORM 是 Android 平台專用ORM。提供簡單易學的APIs。可以很容易的處理1對1和1對多的關系型數據,並通過3個函數save(), delete() 和 find() (或者 findById()) 來簡化CRUD基本操作。
要啟用SugarORM,需要在你的應用程序 AndroidManifest.xml 配置中添加如下meta-data標簽:
<meta-data android:name="DATABASE" android:value="my_database.db" />
<meta-data android:name="VERSION" android:value="1" />
<meta-data android:name="QUERY_LOG" android:value="true" />
<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.my-domain" />
然後就可以從SugarORM擴展需要保存的數據類:
public class User extends SugarRecord<User> {
String username;
String password;
int age;
@Ignore
String bio; //this will be ignored by SugarORM
public User() { }
public User(String username, String password,int age){
this.username = username;
this.password = password;
this.age = age;
}
}