Realm使用小记

高版本JDK下的Jolokia Realm JNDI RCE小记 0x01 引言 在一个阳光明媚的下午,接到一个渗透测试项目。经过一波资产收集,发现一处jolokia,存在 type=MBeanFactory 和 createJNDIRealm。 https://api.example.com//actuator/jolokia/list 你没看错,这个资源必须//才能访问到。 0x02 一波三折的RCE 1. 本着面向github渗透,利用公开的poc打了一波。 引用:https://github.com/LandGrey/SpringBootVulExploit# 阅读详情

最近有点空闲时间,就记录一下以前忘记记录的内容。
Realm是一个能够代替SQLite和Core Data的手机数据库。使用 C++ 内核,所以效率非常的高,是 sqlite 的近几倍。
其实我们自己也可以写demo测试一下存储相同数据,两个数据库所消耗的时间。
Realm在多个平台上都可以使用,据说数据库文件可以在多个平台上通用。
这里写图片描述

添加依赖,在工程目录下的build.gradle中加上

classpath "io.realm:realm-gradle-plugin:1.0.0"

在使用的module中加上

apply plugin: 'realm-android'

首先我们先建立一个数据库
最好是写一个Dao类,也可以写多个,但是数据库最好不要建多个,维护起来比较困难。

Realm myRealm = null;
    RealmConfiguration defaultConfig;

    public BaseDao(Context context) {
        //定义了一个
        defaultConfig = new RealmConfiguration.Builder(context)
                .name("xxx").schemaVersion(1).deleteRealmIfMigrationNeeded().build();
        myRealm = Realm.getInstance(defaultConfig);
    }

    public Realm getMyRealm() {
        if(myRealm != null)
        return myRealm;
        else return Realm.getInstance(defaultConfig);
    }

其实Realm数据库的创建方式有非常多种。这里只展示了我自己写的。
Realm数据库的名称是可以不用指定的,如果只有一个数据库,可以不指定,在调试的时候也会省很多事。
还可以创建一个默认的Config。
Realm.setDefaultConfiguration(defaultConfig);
获取Realm的时候
Realm.getDefaultInstance();
看上去简单很多,而且可以不用传context。
Realm初始化是有非常多配置的。
.schemaVersion(1) 设置一个版本号,如果没设置,默认是0
.encryptionKey() 数据库加密
.deleteRealmIfMigrationNeeded() 迁移方案的一种,当数据库结构改变时,删除原数据库中的所有数据, 这在debug版本的时候非常有用,一旦应用上线,需要保留原数据数据,这个方案就不适用了。
.migration() 指定一个迁移方案,如果应用上线之后,数据库结构需要发生改变,可以通过配置Migration来解决,用于将原数据库中的数据迁移到新数据库中。

其实还有很多,详细的还是看官方文档(中文版)吧。
https://realm.io/cn/docs/java/latest/#section

存储

接下来,我们来实现存储一个对象
比如我们要存储的对象是User
需要让User对象继承RealmObject,接下来就是在Dao类中添加一个存储User对象的方法。

public void setUser(User user) {
            myRealm.beginTransaction();
            myRealm.copyToRealm(user);
            myRealm.commitTransaction();
    }

是不是非常简单。

存储list也一样,在copyToRealm位置添加一个循环即可。

查询

把刚存进去的user查出来

public User getUser() {
        return myRealm.where(User.class).findFirst();
    }

简单到不行。
查询list,加一些条件即可。如:.equalTo("type", type)
等等。
不过要注意的是,从Realm中查询出来的对象,当realm被关闭的时候,就无法再使用,所以最好的方式是,查询出来的对象,复制到一个新的list当中。

表关联

Realm数据库允许我们存一个list,例如这样

public class User extends RealmObject{
    private int userid;
    private String username;
    private RealmList<Clazz> clazzs;
}

但前提是必须用RealmList保存,并且list中的对象也必须是继承RealmObject的,实际上就和表一样。
这里写图片描述
这里写图片描述
存储的时候直接和存普通对象一样即可。

过滤、排序等等

myRealm.where(Article.class)
                //articleName 字段 以职场动态 开头
                .beginsWith("articleName","职场动态")
                //age 字段在1~6之间的
                .between("age",1,6)
                //name 字段包含 fancy的
                .contains("name","fancy")
                //对articleName 去重
                .distinct("articleName")
                //age 总共
                .sum("age")
                //最大
                .max()
                //数量
                .count()
                //平均值
                .average()
                //按照type字段排序
                .findAllSorted("type");

上述代码不能执行,只是为了说明用法。

Migration 数据库迁移

当数据库结构发生改变的时候,我们需要配置Migration来实现数据迁移的操作。
首先新建一个MyMigration

public class MyMigration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

    }
}

将新建的Migration配置进去,并删除deleteRealmIfMigrationNeeded
对应版本号要增加一下,如果开始没有设置版本号,则新版本号设置为1

defaultConfig = new RealmConfiguration.Builder(context)
                .name("xxx")
                .schemaVersion(2)
                .migration(new MyMigration())
                .build();

假如版本号为1的数据又一张 user表,里面有userid,username,password属性。
现在我要增加一张新的表dog,并且要在user表中加一个description属性。
我们的Migration中应该如何去写呢。

public class MyMigration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if (oldVersion == 1) {
            schema.create("Dog")
                    .addField("name", String.class)
                    .addField("age", int.class);
            schema.get("User")
                    .addField("description", String.class);
            oldVersion++;
        }
    }
}

也还算比较简单的。

数据库内容查看

首先在整个工程目录下build.gradle中添加:

allprojects {
    repositories {

        maven {
            url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'
        }
    }
}

然后在使用到realm的module中添加:

debugCompile 'com.facebook.stetho:stetho:1.3.1'
debugCompile 'com.uphyca:stetho_realm:0.9.0'

在Application中添加一些代码:

Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                        .enableWebKitInspector(RealmInspectorModulesProvider.builder(this)
                                .databaseNamePattern(Pattern.compile("search"))
                                .build())
                        .build());

如果数据库名字是默认的则删掉上面那句 .databaseNamePattern(Pattern.compile("search"))
即可。

选择编译debug版本,成功运行到手机后,在谷歌浏览器中输入:

chrome://inspect/#devices

记住是谷歌浏览器,其他浏览器不行。
然后就可以查看数据库中的数据了。
这里写图片描述

这里写图片描述

这里面也可以查看sharedPreference中的数据
点击Local Storage中的自己应用程序的包名就可以查看内容了。

基本上简单的用法就是这些了,以后有什么再继续补充。

———————————————— Realm的坑 ——————————————————
1.so配置问题,另一篇博客有提到
2.Realm的异步操作,如果使用RxJava等进行异步需要将bean复制一份出来才行。
3.RealmChangeListener要慎用,有时不回调。

以上内容基于Realm1.0.0。
Tip:新版本Realm数据库(2.0.0以上)数据查看,如果没有设置数据库名称,依然可以用上面提到的方式查看数据库数据。

总而言之,Realm里面的坑还是挺多的,经过一年的使用,大大小小的坑都踩过,现在还在坚持,有踩到坑不知道的解决的欢迎留言,希望我的一些经验能够帮到你。

对本文内容有任何疑问欢迎加群讨论:283272067

TIA西门子博途V19安装教程及注意事项 阅读详情

相关推荐

Keil5安装教程(保姆级)Keil5mdk安装步骤

6、复制生成的激活码,粘贴在New License ID Code处,点击Add LIC,即可成功激活mdk,显示mdk的使用期限。6、复制生成的激活码,粘贴在New License ID Code处,点击Add LIC,即可成功激活C51,显示mdk的使用期限;3、在安装文件中点击keygen.exe文件,粘贴复制过的CID,选择Target为C51,点击Generate,生成激活码;4、在弹出的界面中会自动安装在安装keil的路径,点击“Next”进行后续安装,安装完成后,点击“Finish”。

m6886258的博客 9万+

Taro+React+TS+Redux+Taro UI项目

Taro+React+TS+Redux+Taro UI项目

iYNing的博客 2031

脑机接口(BCI)从原理到开发实战 09|SSVEP应用:通过视觉刺激控制设备

本文介绍了稳态视觉诱发电位(SSVEP)脑机接口技术。SSVEP是一种高效的非侵入式BCI范式,当用户注视特定频率闪烁的视觉刺激时,大脑枕叶会产生对应的节律性响应。文章详细阐述了SSVEP的神经机制、刺激范式设计、数据预处理方法,重点讲解了典型相关分析(CCA)这一核心识别算法。相比运动想象和P300范式,SSVEP具有信息传输率高(60-100 bits/min)、信号稳定、无需训练等优势,在高速拼写、设备控制等领域应用广泛。文章还提供了完整的电极选择、滤波、分段等预处理流程,以及CCA和滤波器组CCA的

小明的博客 1350

酒浓码浓 - react-redux / Provider

Provider 我们知道redux可以很好的处理庞大的数据(store),而react的组件化机制,繁琐的父子,爷孙上下级的关系,面对这些数据的交互怎么能更好的将数据灵活使用呢。 那就是provider。 provider能将store中的数据打至子组件内。在子组件中connect桥接的state就可以完美的接收使用了。 使用: 父组件: 引入 在render中,pr...

酒浓码浓 292

(超详细)互补格雷码+相移码求解包裹相位(Python实现)

记录实现“互补格雷码+相移码”求解包裹相位的编码过程。也可以叫它“5+4”法,5代表五幅格雷码图像,4代表四步相移法的四张正弦条纹图。

暴雨梨花博客 3万+

把 ABAP ALE Change Pointers 讲透:从 CDHDR/CDPOS 到 BDCP2,再到 RBDMIDOC 的自动分发链路

摘要:SAP ALE Change Pointers机制在系统集成中实现业务变更与数据分发的解耦。它记录业务对象变更(如SAP主数据修改),但不立即发送,而是由后续分发逻辑决定发送时机和方式。该机制包含两层:Change Documents记录审计级变更明细,Change Pointers标记需分发的关键变更。配置核心包括全局开关、消息类型激活和字段选择。典型应用如零售价格条件变更自动推送至POS系统,通过BDCP2表存储待处理队列,由RBDMIDOC程序定时评估生成IDoc。运维需关注定期清理和性能优化,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 209

Realm 数据库的简单使用

Realm 出来这么久了,一直没时间巩固,今天就花点时间巩固下吧。 在没接触Realm之前,基本都是用Sqlite,现在都抛弃Sqlite了,相对于Sqlite来说,Realm更快并且具有很多现代数据库的特性,支持JSON,流式api等,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。当然,现在Realm支持的语言挺多的,更多。现在已更新到2.2.0版,下面都是基于2.2.0实现的。

Hedong的博客 6798

第五节_PySide6基本窗口控件_主窗口和标签

本文介绍了PySide6中主窗口和标签控件的使用。主要内容包括: 窗口控件分类: QWidget是基础窗口部件,可作为独立窗口或子部件 QMainWindow提供标准应用程序框架,包含菜单栏、工具栏等 QDialog用于对话框,支持模态交互 主窗口创建: 演示了如何创建QMainWindow子类 实现了窗口居中、设置图标、状态栏等功能 提供了窗口几何信息的获取方法 QLabel标签控件: 继承自QFrame类 用于显示文本或图像 文章通过代码示例详细说明了主窗口的创建和使用方法,包括位置控制、图标设置等常见

su桥木的博客 1021

React Router路由的使用

在react-router-dom中引入RouterProvider和createBrowserRouter,createBrowserRouter函数中是一个数组,数组的元素都是对象,里面保存的是路由信息,最重要的两个属性是path和element。路由后面直接问号拼接;在指定路由的渲染组件时,可以导入组件后,将组件作为element的值,这种情况在组件较多时性能不太好,因为用户可能只浏览了其中几个,但却全部组件都导入去运行了一遍,就做了无用功,这时候可以使用懒加载,根据路由情况进行导入。

gyutdcu的博客 1597

Matlab实现雷达波位编排

1 简介 %本程序用于雷达球坐标系到正弦空间坐标系的转换,以及相控阵雷达的波位编排。 2 完整代码 ​%070228添加波位数据保存clear allclose allclc%波束宽度,单位:度BeamWidth = 3.6;theta05 = round(sin(BeamWidth*pi/180)*1000)/1000;%雷达作用空域AZ = [-15 15]; %方位角范围(雷达球坐标系),单位:度EL = [0 30]; %俯仰角范围(雷

qq_59747472的博客 2479

海思Hi3519A开发:DSP开发指南

通过创建DSP项目、实现算法、编译调试等步骤,开发者可以充分利用Hi3519A芯片集成的DSP,实现各种音视频处理功能。通过以上示例,我们可以看到在Hi3519A开发平台上进行DSP开发是一项强大而灵活的任务。在调试过程中,可以使用调试工具提供的功能,如断点设置、变量查看等,以便更好地理解和优化DSP算法的执行过程。在Hi3519A开发平台上,我们可以利用DSP的高性能计算能力来加速这些算法的执行。在实际的DSP开发中,算法的实现可能更加复杂,需要结合具体的项目需求进行。3.2 DSP算法实现。

QoTypescript的博客 1495

react-router-dom中的BrowserRouter和HashRouter

如果前端使用了,每次改变路由时,会向服务器发送请求,因为服务器未配置对应的路径指向对应的文件,自然导致出现的情况.(对于初始化页面,即路由为/时,不会发送请求)因此在使用需要再加一层服务器配置(node/Nginx),让前端发送的请求映射到对应的文件上.由于hashRouter会在路径上添加,而后面的所有都不会发送到服务器端,即对于服务器而言,路径依旧是,路由切换在前端完成。但是官方会更推荐使用browserRouter,貌似是因为其构建于H5的History API,比起hashRouter,它多出了更多

go 1635

2024年数字IC秋招-速腾聚创-数字芯片验证工程师-笔试题

笔试题型:单选 + 问答题笔试平台:牛客(手机+电脑监控)笔试时间:1hA. len取10的概率是1/2;B. len取10的概率是1/3;C. len取10的概率是1/4;D. len取10的概率是1;

qq_42135020的博客 1399

IOS Realm使用小记

Swift Realm 使用 之前写过一篇Android的Realm的使用小记,后来接触IOS开发了,现在写一篇在IOS中使用Realm数据库的记录 本文使用的是'RealmSwift','= 3.13.1' 导入 在podfile 文件中加入以下代码 pod 'RealmSwift','= 3.13.1' 执行pod install命令 使用 基本配置 在AppDelegate文件中加...

浅浅清风的博客 869

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Shiro学习小记--身份验证得到principals

shiro中自定义principal

Jafey的博客 5985

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Shiro & Spring Security - 小记

实际开发中: 1. shiro已经满足基本的安全需求,使用简单。 (1)相关注解: @RequiresRoles("admin") //角色控制 @RequiresPermissions("sys:delete") //功能权限控制 (2)配置类ShiroConfig: package com.kevin.springbootkevin1.config;...

ଳxin的博客 306

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SQLite小记

静以修身,俭以养德 原文链接 一、移动端数据库方案 1、关系型数据库 SQLite:轻量级的关系数据库, 占用资源非常少,目前广泛应用于Android、iOS等手机操作系统。iOS使用时SQLite,只需要加入libSQLite3.0.tbd依赖以及引入SQLite3.h头文件即可。 Apple内建的CoreData底层的持久化方式可以是SQLite数据库,也可以是XML文件、甚至是内存; 比较...

weixin_33719619的博客 203

shiro小记

shiro: 流程: 初始化SecurityManager工厂 => 获取SecurityManager => 获取subject => 根据用户名密码创建token => subject.login(token)验证 => 调用自定义的realms: 实现AuthorizingRealm自定义的realms验证流程: 实现doGetAuthen...

weixin_30484247的博客 89

java使用shiro小记

1、架构 hiro是一个强大的简单易用的Java安全框架,主要用来更便捷的认证,授权,加密,会话管理。Shiro首要的和最重要的目标就是容易使用并且容易理解。 Shiro是一个有许多特性的全面的安全框架,下面这幅图可以了解Shiro的特性: 可以看出shiro除了基本的认证,授权,会话管理,加密之外,还有许多额外的特性。 从大的角度来看,Shiro有三个主要的概念...

daxiaojianghujs2016的博客 229

小记springboot配置shiro+jwt

springboot 配置shiro jwt大致流程

白也白 416

学习tomcat 小记(5)

[size=large]安全性[/size] [size=medium] 一些web应用的内容是受限的,只有有特定权限的用户才能访问。 servlet容器通过一个称为authenticator的valve来支持安全认证。当container启动时,authenticator被添加到container的pipeline中。在wrapper被调用之前,会先调用authenticator,用来...

游云的专栏 196

svn update命令小记

今天在使用svn update命令的时候,出现了这么一个提示:   ATTENTION! Your password for authentication realm:&lt;http://nigel.zeng.me:80&gt; Subversion repositorycan only be stored to disk unencrypted! You are advised to co...

成长的日子 1696

面试小记2

sql语句: 求交集:SELECT * FROM table1 AS a JOIN table2 AS b ON a.name =b.name  shiro: 认证过程: 1、通过ini配置文件创建securityManager 2、调用subject.login方法主体提交认证,提交的token 3、securityManager进行认证,securityMa

qq_39346512的博客 235

svn服务器配置小记

在这里/opt/svndata/repos1创建svn版本库svnadmin create /opt/svndata/repos1创建成功后会在/opt/svndata/repos1目录下生成conf/ db/ format hooks/ locks/ README.txtconf目录中有authz passwd svnserve.co...

weixin_30730151的博客 76

Android studio java.lang.UnsatisfiedLinkError

最近开始转android Studio 本来以为新的开发工具会大大的提高效率 。结果我错了。今天踩了一天的坑。 我的项目中用到了so的文件。通常情况下在 eclipse中我们在libs/armeabi 这个目录下放so文件。一般情况下 都可以加载的到。 但是,刚换到AS 我也是这样做的。把so 文件放到 libs/armeabi 这个目录下。同时也在 app的gradle 文件中配置了如下的信...

weixin_30916125的博客 170

打造属于你的加密Helper类

摘要 在我们软件系统设计中,数据的安全性是我们考虑的重中之重,特别像银行系统的设计账户和密码都需进行加密处理。这时我们可以使用加密算法对数据进行加密处理,这就是我们今天要介绍的主题。 首先让我们了解加密算法分为:对称、非对称加密算法和Hash加密。 对称加密算法:首先需要发送方和接收方协定一个密钥K。K可以是一个密钥对,但是...

weixin_30807779的博客 164
上一篇: Rxjava操作符(defer,compose,retryWhen)
下一篇: Rxlifecycle使用详解,解决RxJava内存泄露问题
浅浅清风
博客等级 码龄12年 42粉丝 31原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值