前提・実現したいこと
Realmデータべースにカラムを追加したい。
Android studioでRealmデータベースを用いてアプリ開発をしているのですが、
カラムを追加した後のマイグレーションの実行の方法がわかりません。
(scheduleクラスにtime_limitというカラムを追加しました。
カラム追加以前にはデータベースは正常に動作しておりました。)
発生している問題・エラーメッセージ
Unable to start activity ComponentInfo{com.example.myapplication_practice_1/com.example.myapplication_practice_1.MainActivity}: io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors: - Property 'Schedule.time_limit' has been added.
該当のソースコード
Migration.java
java
1package com.example.myapplication_practice_1; 2 3import android.transition.Scene; 4 5import java.util.Locale; 6 7import io.realm.DynamicRealm; 8import io.realm.FieldAttribute; 9import io.realm.RealmConfiguration; 10import io.realm.RealmMigration; 11import io.realm.RealmSchema; 12import io.realm.annotations.RealmModule; 13 14 15public class Migration implements RealmMigration { 16 @Override 17 public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 18 Long version = oldVersion; 19 20 // DynamicRealm exposes an editable schema 21 RealmSchema schema = realm.getSchema(); 22 23 // Changes from version 0 to 1: Adding lastName. 24 // All properties will be initialized with the default value "". 25 if (version == 0L) { 26 schema.get("Schedule") 27 .addField("time_limit", Schedule.class); 28 oldVersion++; 29 } 30 }; 31 32 @RealmModule(classes = { Schedule.class }) 33 public class Module {} 34 35 RealmConfiguration config = new RealmConfiguration.Builder() 36 .modules(new Module()) 37 .schemaVersion(1) // Must be bumped when the schema changes 38 .migration(new Migration()) // Migration to run instead of throwing an exception 39 .build(); 40} 41
Schedule.java
java
1package com.example.myapplication_practice_1; 2 3import java.util.Calendar; 4import java.util.Date; 5 6import io.realm.RealmObject; 7import io.realm.annotations.PrimaryKey; 8 9public class Schedule extends RealmObject { 10 @PrimaryKey 11 public long id; //各データを見分けるためのデータID 12 public Date date; //日付のデータ 13 public String TaskName; //タスク名 14 public String time_limit; //期限 15}
realm_test.java
java
1package com.example.myapplication_practice_1; 2 3import androidx.annotation.RequiresApi; 4import androidx.appcompat.app.AppCompatActivity; 5 6import android.icu.util.Calendar; 7import android.os.Build; 8import android.os.Bundle; 9import android.util.Log; 10import android.view.View; 11import android.widget.Button; 12import android.widget.TextView; 13 14import java.text.SimpleDateFormat; 15import java.util.Date; 16import java.util.TimeZone; 17 18import io.realm.Realm; 19import io.realm.RealmResults; 20 21public class realm_test extends AppCompatActivity { 22 23 Realm mRealm; 24 private TextView mTextView; 25 26 @RequiresApi(api = Build.VERSION_CODES.N) 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_realm_test); 31 32// インスタンスを取得 33 mRealm = Realm.getDefaultInstance(); 34 Calendar cl = Calendar.getInstance(); 35 36 mTextView = (TextView)findViewById(R.id.textView); 37 Button create = (Button)findViewById(R.id.create); 38 Button read = (Button)findViewById(R.id.read); 39 Button update = (Button)findViewById(R.id.update); 40 Button delete = (Button)findViewById(R.id.delete); 41 Button back = (Button)findViewById(R.id.Back_Button); 42 43 create.setOnClickListener(new View.OnClickListener(){ 44 @Override 45 public void onClick(View v) { 46 47 mRealm.executeTransaction(new Realm.Transaction(){ 48 @Override 49 public void execute(Realm realm) { 50 Number max = realm.where(Schedule.class).max("id"); 51 long newId = 0; 52 53 if(max != null){ 54 newId = max.longValue()+1; 55 } 56 57 Schedule schedule = realm.createObject(Schedule.class,newId); 58 schedule.date=new Date(); 59 60 java.util.Calendar calendar = java.util.Calendar.getInstance(); 61 62 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd"); 63 64 String age = sdf.format(calendar.getTime()); 65 schedule.TaskName = age; 66 schedule.time_limit="2012"; 67 68 mTextView.setText("登録しました\n"+schedule.toString()); 69 } 70 }); 71 } 72 }); 73 74 read.setOnClickListener(new View.OnClickListener(){ 75 @Override 76 public void onClick(View v) { 77 mRealm.executeTransaction(new Realm.Transaction(){ 78 @Override 79 public void execute(Realm realm) { 80 RealmResults<Schedule> schedules = realm.where(Schedule.class).findAll(); 81 mTextView.setText("取得"); 82 83 for (Schedule schedule: 84 schedules) { 85 String text = mTextView.getText()+"\n"+schedule.toString(); 86 mTextView.setText(text); 87 } 88 } 89 }); 90 } 91 }); 92 93 update.setOnClickListener(new View.OnClickListener(){ 94 @Override 95 public void onClick(View v) { 96 mRealm.executeTransaction(new Realm.Transaction() { 97 @Override 98 public void execute(Realm realm) { 99 Number max = realm.where(Schedule.class).max("id"); 100 long newId = 0; 101 if(max != null){ 102 newId = max.longValue()+1; 103 } 104 105 Schedule schedule = realm.where(Schedule.class) 106 .findFirst(); 107 108 schedule.TaskName += "<更新>"; 109 110 mTextView.setText("更新しました\n"+schedule.toString()); 111 } 112 }); 113 } 114 }); 115 116 delete.setOnClickListener(new View.OnClickListener() { 117 @Override 118 public void onClick(View v) { 119 mRealm.executeTransaction(new Realm.Transaction() { 120 @Override 121 public void execute(Realm realm) { 122 123 Number min = realm.where(Schedule.class).min("id"); 124 if(min != null){ 125 Schedule schedule = realm.where(Schedule.class) 126 .equalTo("id",min.longValue()) 127 .findFirst(); 128 129 schedule.deleteFromRealm(); 130 mTextView.setText("削除しました\n"+schedule.toString()); 131 } 132 133 134 } 135 }); 136 } 137 }); 138 139 back.setOnClickListener(new View.OnClickListener(){ 140 @Override 141 public void onClick(View v) { 142 finish(); 143 } 144 }); 145 146 147 } 148 149 @Override 150 protected void onDestroy() { 151 super.onDestroy(); 152 mRealm.close(); 153 } 154}
試したこと
まず最初に
マイグレーションの実行が必要だということで、Realmの公式サイトを
参考にさせていただいてmigration.javaを作りました。だたエラーは解消されませんでした。
補足情報(FW/ツールのバージョンなど)
Android studio 最新版(*2021/02/04現在)
仮想マシン(Emulator) Android 11.0
Realm classpath "io.realm:realm-gradle-plugin:3.7.2"
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。