安卓日记:数据库Realm的简单使用

(学习安卓的过程中,了解到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”);
    }
});

综上,算是基本理了遍,效果如下,具体的代码在这里
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值