Android数据库Realm实践

来源:互联网 发布:恐怖黎明物品数据nga 编辑:程序博客网 时间:2024/05/17 08:01

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 以外的 Java 环境;
  • Android Studio >= 1.5.1 ;
  • 较新的 Android SDK 版本;
  • JDK 版本 >=7;
  • 我们支持 Android API 9 以上的所有版本(Android 2.3 Gingerbread 及以上)。
构建依赖关系

第一步: 在项目的 build.gradle 文件中添加如下 class path 依赖。

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

项目的 build.gradle 文件在如下位置:Project level build.gradle file

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

apply plugin: 'realm-android'

app的 build.gradle 文件在如下位置:Application level build.gradle file

如果读者使用的是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 0
原创粉丝点击