在Android加入和使用Realm

原文链接:Up and Running With Realm for Android

介绍

如果你比较关心android开发的最新动态的话,那么你肯定会听说过Realm,Realm是一个轻量级的数据库,在Android开发中,它可以替代SQLiteORM框架。

和SQLite相比,Realm速度更快并且它有很多先进的特性,例如对JSON的支持,流畅的API,数据变化通知(观察者),加密支持… 所有的这一切都会让android开发者日子过得更潇洒(这里扯淡了,开发者日子怎么可能潇洒,当然也可能是国内外不同…)。

这篇文章的主题就是Realm for Android, 在这篇文章中,我将使用Realm v0.84.1

将Realm添加到项目

要在Android项目中使用Realm, 你需要在module的build.gradle文件中添加如下代码:

compile 'io.realm:realm-android:0.84.1'

创建一个Realm

一个Realm和SQLite比较类似。它有一个文件和他作为关联,这个文件一次创建,就会永久存在Android系统中。

想要创建一个Realm, 你可以在任意一个Activity中调用静态方法Realm.getInstance

Realm myRealm = Realm.getInstance(context);

需要注意的是,我们这样创建,没有给它指定RealmConfiguration,这时候创建的文件会使用默认的文件名default.realm
如果你需要创建另外一个Realm,那你就必须要给它传递RealmConfiguration.Builder了,并且要给它指定一个唯一的名称。

Realm myOtherRealm =
        Realm.getInstance(
                new RealmConfiguration.Builder(context)
                        .name("myOtherRealm.realm")
                        .build()
);

创建RealmObject

如果一个javabean继承了RealmObject,那么它就可以用来存储Realm,如果你想知道什么是javabean,来看看这里的定义:javabean是可序列化的,有一个默认的构造方法,成员变量都提供getter和setter方法。例如,下面的代码可以轻松的保存到Realm中,

public class Country extends RealmObject {

    private String name;
    private int population;

    public Country() { }

    public String getName() {
        return name;
    }

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

    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }

}

可以使用@PrimaryKey注解来表示这个一个成员变量是Realm的主键。例如下面的代码是将code字段作为主键,

@PrimaryKey
private String code;

public String getCode() {
    return code;
}

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

创建事务

你将会在下面的代码中发现,使用Realm查询数据非常简单, 写入数据稍稍麻烦点。Realm遵循ACID以保证操作的原子性和一致性。在Realm中,所有的写操作都会在一个事务中。

使用beginTransaction方法可以开启一个事务,使用commitTransaction方法去提交一个事务。下面的代码表明如何创建并保存一个Country

myRealm.beginTransaction();

// Create an object
Country country1 = myRealm.createObject(Country.class); 

// Set its fields
country1.setName("Norway");
country1.setPopulation(5165800);
country1.setCode("NO");

myRealm.commitTransaction();

你可能已经注意到了,country1对象并不是使用Country的构造方法创建的,想让RealmObject保存这个实例, 就必须使用createObject方法创建。

如果你必须要使用构造方法的话,别忘了在提交事务之前调用copyToRealm方法将对象关联到Realm上,例如:

// Create the object
Country country2 = new Country();
country2.setName("Russia");
country2.setPopulation(146430430);
country2.setCode("RU");

myRealm.beginTransaction();
    Country copyOfCountry2 = myRealm.copyToRealm(country2);
myRealm.commitTransaction();

查询

Realm提供了一套非常直观简单的API用来查询操作,调用Realmwhere方法,并且将你需要的类的class传递进去, 你就完成了一个查询的创建,之后, 你可以调用findAll方法来遍历所有的数据,返回的数据保存在RealmResults对象中,下面的例子,我们查询出来并且打印了所有的Country

RealmResults<Country> results1 =
        myRealm.where(Country.class).findAll();

for(Country c:results1) {
    Log.d("results1", c.getName());
}

// Prints Norway, RussiaRealmResults<Country> results1 =
        myRealm.where(Country.class).findAll();

for(Country c:results1) {
    Log.d("results1", c.getName());
}

// Prints Norway, Russia

除此之外, 你还可以使用beginsWithendsWithlesserThangreaterThan方法来过滤结果,下面的例如展示了如何使用greaterThan方法来查询所有的population大于1亿的Country

RealmResults<Country> results2 =
        myRealm.where(Country.class)
                .greaterThan("population", 100000000)
                .findAll();

// Gets only Russia

如果你想让查询结果按照某个顺序来,你可以使用findAllSorted方法,它有一个String类型的参数和一个boolean类型的参数,其中,String指定用来排序的字段,boolean指定了排序方式,

// Sort by name, 降序排列
RealmResults<Country> results3 =
        myRealm.where(Country.class)
                .findAllSorted("name", false);

// Gets Russia, Norway

想要学习更多关于Realm的知识,可以参考官方文档

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android Studio提供了多种数据库选项,其中包括SQLiteRealm和Room等。其中,SQLite是默认的本地数据库选项,而Realm和Room则提供更高级别的功能。 以下是使用SQLiteAndroid Studio中创建和使用数据库的基本步骤: 1. 创建一个新的Android Studio项目,并在build.gradle文件中添加以下依赖项: ``` dependencies { implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:support-core-utils:28.0.0' implementation 'com.android.support:support-annotations:28.0.0' implementation 'com.google.android.gms:play-services-maps:15.0.1' // SQLite implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+' } ``` 2. 在app的build.gradle文件中添加以下配置: ``` defaultConfig { applicationId "com.example.myapp" minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName "1.0" // 添加数据库的名称和版本号 javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } ndk { abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64' } } // 定义数据库的版本号 def ROOM_VERSION = "2.2.5" // 添加Room的依赖项 dependencies { // Room components implementation "androidx.room:room-runtime:$ROOM_VERSION" annotationProcessor "androidx.room:room-compiler:$ROOM_VERSION" // Optional RxJava2 support for Room implementation "androidx.room:room-rxjava2:$ROOM_VERSION" // Optional Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$ROOM_VERSION" // Test helpers testImplementation "androidx.room:room-testing:$ROOM_VERSION" } ``` 3. 创建一个DatabaseHelper类,用于创建和管理数据库: ``` public class DatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "myapp.db"; private static final String TABLE_NAME = "mytable"; private static final String COLUMN_ID = "id"; private static final String COLUMN_NAME = "name"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_NAME + " TEXT" + ")"; db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } public void addData(String name) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, name); db.insert(TABLE_NAME, null, values); db.close(); } public List<String> getAllData() { List<String> data = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); if (cursor.moveToFirst()) { do { data.add(cursor.getString(1)); } while (cursor.moveToNext()); } cursor.close(); db.close(); return data; } } ``` 4. 在Activity中使用DatabaseHelper类来添加和获取数据: ``` public class MainActivity extends AppCompatActivity { private DatabaseHelper db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DatabaseHelper(this); db.addData("John"); db.addData("Jane"); List<String> data = db.getAllData(); for (String name : data) { Log.d("MainActivity", "Name: " + name); } } } ``` 这样就可以在Android Studio中使用SQLite数据库了。当然,如果需要更高级别的功能,可以考虑使用Realm或Room。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值