🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

3034閲覧

Realm マイグレーションの実行方法

takara12

総合スコア0

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/02/04 16:41

編集2021/02/04 16:47

前提・実現したいこと

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"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

RealmConfigurationを生成しただけで使用していないのが誤りです。
Realm.getInstance実行時に、マイグレーションの必要があった場合に処理を行うクラスをconfigで指定します。
Open a Realm

Java

1SyncConfiguration config = new SyncConfiguration.Builder( 2 ......) 3 .build(); 4Realm backgroundThreadRealm = Realm.getInstance(config);

Migrations

Java

1RealmConfiguration config = new RealmConfiguration.Builder() 2 .modules(new Module()) 3 .schemaVersion(3) // Must be bumped when the schema changes 4 .migration(new Migration()) // Migration to run instead of throwing an exception 5 .build();

もしくは、手動で行います。
realm/realm-java/migrationExample

Java

1try { 2 Realm.migrateRealm(config, new Migration()); 3} catch (FileNotFoundException ignored) { 4 // If the Realm file doesn't exist, just ignore. 5} 6realm = Realm.getInstance(config);

投稿2021/02/05 07:26

dsuzuki

総合スコア1682

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問