0
点赞
收藏
分享

微信扫一扫

Android数据库Realm实践


Android开发中常用的数据库有5个:

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基本操作。



​​3. GreenDAO​​


当性能很重要时(数据访问频繁),GreenDao是一个很快的解决方案,它能够支持数千条记录的CRUD每秒,和OrmLite相比,GreenDAO要快几乎4.5倍。(准确数据请自行benchmark)。


GreenDAO小于100KB,所以对于应用程序APK的大小影响很小。

4. ​​Active Android​​


Active Record(活动目录)是Yii、Rails等框架中对ORM实现的典型命名方式。Active Android 帮助你以面向对象的方式来操作SQLite。


在你的项目中包含Active Android,你需要在项目的 /libs 目录下添加一个jar文件。可以从Github中获取源代码并使用Maven进行编辑。


5. ​​Realm​​


Realm 是一个将可以使用的Android ORM,基于C++编写,直接运行在你的设备硬件上(不需要被解释),因此运行很快。它同时是开源跨平台的,iOS的代码可以在GitHub找到,你还可以找到Objective C以及Swift编写的Realm使用实例。



相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。

Ream提供了五种编程方式的实现。分别是Java,Objective C,Swift,React-Native,tamarin。在这里我着重介绍在Android中的使用。

大家可以直接看官方的文档,我也是在这基础的上讲解:​​realm使用​​

Android数据库Realm实践_数据库

快速入门


运行环境

  • 目前我们还不支持 Android 以外的 Java 环境;
  • Android Studio >= 1.5.1 ;
  • 较新的 Android SDK 版本;
  • JDK 版本 >=7;
  • 我们支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。

构建依赖关系


第一步:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:1.0.0"
}
}

项目的 ​​build.gradle​

第二步: 在 app 的 build.gradle 文件中应用 ​​realm-android​

apply plugin: 'realm-android'

app的 ​​build.gradle​

如果读者使用的是maven构建项目,官方也有说明,这里我就不列出来了。

说到这里,我们已经迫不及待的想尝试下了。

1,application里面初始化


public class RealmApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
init();
}

private void init() {
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(realmConfiguration);
}
}


2,创建工具管理类,获取Realm实例


public class RealmUtils {
private static RealmUtils instance;
public final Context mContext;
private String realmName = "realm_demo.realm";

public RealmUtils(Context mContext) {
this.mContext = mContext;
}

public static RealmUtils getInstance(Context context){
if (instance == null) {
synchronized (RealmUtils.class) {
if (instance == null) {
instance = new RealmUtils(context);
}
}
}
return instance;
}

public Realm getRealm(){
Realm realm =Realm.getInstance(new RealmConfiguration.Builder(mContext).name(realmName).build());
return realm;
}
}

3,创建一个realmObject对象,存储object

例如,我们现在需要存储一个人(Person)对象,注意,这里的成员属性为了realm的序列化,都写成私有的


public class Person extends RealmObject {

@PrimaryKey
private String code;//编号
private String name;//姓名
private int age;//年龄


public Person() {
}

public Person(int age, String code, String name) {
this.age = age;
this.code = code;
this.name = name;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}


4,定义几个CRUD的方法,供其它类实现


public interface PersonDao {

//插入
void insert(Person person) throws Exception;

//查询
List<Person> getAllPerson() throws Exception;

//更新
Person updatePerson(Person person) throws Exception;

//删除
void deletePerson(String code) throws Exception;

// 异步插入
void insertPersonAsync(Person person) throws Exception;
}

5,对象的具体实现


public class PersonDaoImpl implements PersonDao {

private Context context;
private Realm mRealm;

public PersonDaoImpl(Context context){
mRealm = RealmUtils.getInstance(context).getRealm();
}

@Override
public void insert(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealm(person);
mRealm.commitTransaction();
mRealm.close();
}

@Override
public List<Person> getAllPerson() throws Exception {
List<Person> mlist = null;
mlist = mRealm.where(Person.class).findAll();
mRealm.close();
return mlist;
}

@Override
public Person updatePerson(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealmOrUpdate(person);
mRealm.commitTransaction();
mRealm.close();
return person1;
}

@Override
public void deletePerson(String code) throws Exception {
Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();
mRealm.beginTransaction();
person.deleteFromRealm();
mRealm.commitTransaction();
}

@Override
public void insertPersonAsync(final Person person) throws Exception {
//一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象:
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.beginTransaction();
Person person1 = realm.copyToRealm(person);
realm.commitTransaction();
realm.close();//并且要记得在离开线程时要关闭 realm.close();
}
});
//关闭Realm对象
mRealm.close();
}
}


6,测试


public class MainActivity extends AppCompatActivity {

private Realm mRealm;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}

private void init() {
Person person = new Person();
person.setName("测试");
person.setAge(28);
person.setCode("xxxx");
PersonDao dao = new PersonDaoImpl(this);


try {
//增加
dao.insert(person);
//查询全部
dao.getAllPerson();
//指定code删除
dao.deletePerson("xxxx");
//更新
dao.updatePerson(person);
} catch (Exception e) {
e.printStackTrace();
}
}


}


其实这和以前的用法差不多的,有点在于,realm去帮我们管理这个数据库,并且在安全上我这还没有讲到,这里只讲了基本用法,大家可以去看看官方的文档说明:

​​官方文档​​


举报

相关推荐

0 条评论