(学习安卓的过程中,了解到Realm数据库框架,并尝试使用,将一些心得记下来,以供以后考古,哈哈)
1.关于Realm
Realm本质上是一个嵌入式数据库,支持运行在手机、平板和可穿戴设备上,其设计有自己的数据库引擎,在于避免 ORM 架构以及其带来的抽象方式,目标是取代SQLite
为什么使用realm:
-
易用
Ream 不是在SQLite基础上的ORM,它有自己的数据查询引擎。并且十分容易使用。 -
快速
由于它是完全重新开始开发的数据库实现,所以它比任何的ORM速度都快很多,甚至比SLite速度都要快 -
跨平台
Realm 支持 iOS & OS X (Objective‑C & Swift) & Android。我们可以在这些平台上共享Realm数据库文件,并且上层逻辑可以不用任何改动的情况下实现移植。 -
高级
Ream支持加密,格式化查询,易于移植,支持JSON,流式api,数据变更通知等高级特性 -
可视化
Realm 提供了一个轻量级的数据库查看工具,开发者可以查看数据库当中的内容
Mac:在Mac Appstore 可以下载“Realm Browser”这个工具
window:可以参考这个,但我还没有试
2.使用
Step1:添加依赖
在项目根目录下的build.gradle中的dependencies添加
dependencies {
classpath "io.realm:realm-gradle-plugin:2.2.1"
}
在项目app文件夹中添加
apply plugin: 'realm-android'
Step2:创建一个继承于RealmObject的类,这里有两种方法
/**
* 方法一:直接继承于RealmObject来声明
*
* @PrimaryKey 表示该字段是主键
* @Required 表示该字段非空
* @Ignore 表示忽略该字段
* @Index 添加搜索索引
*/
public class UserDB extends RealmObject {
private String userName;
private String passWord;
//对象的get,set方法
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName=userName;
}
public String getPassWord(){
return passWord;
}
public void setPassWord(String passWord){
this.passWord=passWord;
}
}
/**
* 方法二:通过实现 RealmModel接口并添加 @RealmClass修饰符来声明
*/
@RealmClass
public class UserDB implements RealmModel{
......
}
Step3:在activity中使用realm
Realm.init(this);
//实例化数据库
RealmConfiguration config=new RealmConfiguration.Builder()
.name("UserRealm.realm")//文件名
.encryptionKey(new byte[64])//加密用字段,不是64位会报错
.schemaVersion(0)//版本号
.build();
/**
* 其他方法:
* Builder.name : 指定数据库的名称。如不指定默认名为default。
* Builder.schemaVersion : 指定数据库的版本号。
* Builder.encryptionKey : 指定数据库的密钥。
* Builder.migration : 指定迁移操作的迁移类。
* Builder.deleteRealmIfMigrationNeeded : 声明版本冲突时自动删除原数据库。
* Builder.inMemory : 声明数据库只在内存中持久化。
* build : 完成配置构建。
*/
realm=Realm.getInstance(config);
......
//关闭Realm
@Override
protected void onDestroy() {
super.onDestroy();
realm.close();
}
注意:不同的activity使用同一个.realm文件时配置必须相同;
若没加Realm.init(this),会报Call `Realm.init(Context)` before creating a RealmConfiguration的错
Step4:增、删、改、查
//这里我使用了listview来显示数据,方法思路与使用SQLite是一致,只是增、删、改、查使用的语句不一样罢了
//增
private void realmInsert(Realm realm){
username=(EditText)findViewById(R.id.et_username);
password=(EditText)findViewById(R.id.et_password);
realm.beginTransaction();//开启事务
UserDB user=realm.createObject(UserDB.class);
user.setUserName(username.getText().toString());
user.setPassWord(password.getText().toString());
realm.commitTransaction();//提交事务
user=realm.where(UserDB.class).findFirst();
}
//查
private List<Map<String, Object>> getData() {
RealmResults<UserDB> userList = realm.where(UserDB.class)
.findAll();
list=new ArrayList<Map<String, Object>>();
map = new HashMap<String, Object>();
for (int i = 0; i < userList.size(); i++) {
//Log.d("1", "1==>" + userList.get(i).getUserName() + "----" + userList.get(i).getPassWord());
String lv_username = userList.get(i).getUserName();
String lv_password = userList.get(i).getPassWord();
map=new HashMap<String,Object>();
map.put("username",lv_username);
map.put("password",lv_password);
list.add(map);
}
return list;
}
//删
case 2:
final int position=(int) lv_user.getAdapter().getItemId(menuInfo.position);
if (list.remove(position)!=null){
final RealmResults<UserDB> user=realm.where(UserDB.class).findAll();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
user.deleteFromRealm(position);
}
});
}else {
System.out.println("failed");
}
getData().clear();
adapter.notifyDataSetChanged();
break;
//改(我项目中并没有写关于改的语句,这里只是展示下关于改的语句如何写)
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//先查找后得到User对象
UserDB user = realm.where(UserDB.class).findFirst();
user.setusername(“XXXX”);
user.setpassword(“XXXX”);
}
});
综上,算是基本理了遍,效果如下,具体的代码在这里