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
文件在如下位置:
第二步: 在 app 的 build.gradle 文件中应用 realm-android
插件。
apply plugin: 'realm-android'
app的 build.gradle
文件在如下位置:
说到这里,我们已经迫不及待的想尝试下了。
1,application里面初始化
public class RealmApplication extends Application {@Overridepublic 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 {@PrimaryKeyprivate 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;}@Overridepublic 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();}@Overridepublic void insert(Person person) throws Exception {mRealm.beginTransaction();Person person1 = mRealm.copyToRealm(person);mRealm.commitTransaction();mRealm.close();}@Overridepublic List<Person> getAllPerson() throws Exception {List<Person> mlist = null;mlist = mRealm.where(Person.class).findAll();mRealm.close();return mlist;}@Overridepublic Person updatePerson(Person person) throws Exception {mRealm.beginTransaction();Person person1 = mRealm.copyToRealmOrUpdate(person);mRealm.commitTransaction();mRealm.close();return person1;}@Overridepublic void deletePerson(String code) throws Exception {Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();mRealm.beginTransaction();person.deleteFromRealm();mRealm.commitTransaction();}@Overridepublic void insertPersonAsync(final Person person) throws Exception {//一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象:mRealm.executeTransaction(new Realm.Transaction() {@Overridepublic 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;@Overrideprotected 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去帮我们管理这个数据库,并且在安全上我这还没有讲到,这里只讲了基本用法,大家可以去看看官方的文档说明:
官方文档