質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

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

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

8172閲覧

RealmMigrationNeededExceptionというエラーの解決方法が分からない

intenseG

総合スコア34

Realm

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

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2016/10/23 04:59

編集2016/10/23 05:38

###前提・実現したいこと

前回、「Realmを使ってリストビューを表示することができない」という内容で質問させて頂きアドバイスのおかげで自己解決したと思ったのですが、実機でテストをすると

Java

1realm = Realm.getDefaultInstance();

この場所で「RealmMigrationNeededException」というエラーが発生して前に進めない状況です。

エラー文で検索して解決策を探してみましたが難しくて理解できず。

よろしければアドバイスよろしくお願いします。

###発生している問題・エラーメッセージ

Caused by: io.realm.exceptions.RealmMigrationNeededException: RealmMigration must be provided at io.realm.BaseRealm.migrateRealm(BaseRealm.java:741) at io.realm.Realm.migrateRealm(Realm.java:1331) at io.realm.Realm.migrateRealm(Realm.java:1318) at io.realm.Realm.createInstance(Realm.java:227) at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:126) at io.realm.Realm.getDefaultInstance(Realm.java:166) at com.example.oubeika.tsumegonomori.ProblemList.onCreate(ProblemList.java:52) at android.app.Activity.performCreate(Activity.java:5245) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2179) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2292)  at android.app.ActivityThread.access$800(ActivityThread.java:149)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:136)  at android.app.ActivityThread.main(ActivityThread.java:5265)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:639)  at dalvik.system.NativeStart.main(Native Method) 

###該当のソースコード

ProblemList.java

Java

1public class ProblemList extends AppCompatActivity { 2 3 public static final String EXTRA_GODATA = "com.example.oubeika.tsumegonomori.GoData"; 4 5 private Realm realm; 6 private RealmResults<GoData> results; 7 private RealmChangeListener realmListener = new RealmChangeListener() { 8 9 @Override 10 public void onChange(Object element) { 11 reloadListView(); 12 } 13 }; 14 15 private ListView listView; 16 private GoDataAdapter adapter; 17 18 @Override 19 protected void onCreate(@Nullable Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.problem_list); 22 23 //Realmの設定 24 realm = Realm.getDefaultInstance(); 25 realm.addChangeListener(realmListener); 26 27 //ListViewの設定 28 listView = (ListView) findViewById(R.id.listView1); 29 30 if (adapter == null) { 31 try { 32 results = loadGoData(); 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 37 adapter = new GoDataAdapter(ProblemList.this); 38 adapter.setGoData(results); 39 40 //ListViewに表示 41 listView.setAdapter(adapter); 42 adapter.notifyDataSetChanged(); 43 44 addGoData(); 45 46 reloadListView(); 47 } 48 49 //ListViewをタップしたときの処理 50 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 51 @Override 52 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 53 54 GoData goData = (GoData) parent.getAdapter().getItem(pos); 55 56 Intent intent = new Intent(ProblemList.this, Problem.class); 57 intent.putExtra(EXTRA_GODATA, goData); 58 59 startActivity(intent); 60 } 61 }); 62 } 63 64 @Override 65 protected void onDestroy() { 66 super.onDestroy(); 67 68 realm.close(); 69 } 70 71 private RealmResults<GoData> loadGoData() throws IOException { 72 73 BufferedReader br; 74 String json = ""; 75 76 InputStream is = getAssets().open("sgfdata.json"); 77 78 //realm.beginTransaction(); 79 try { 80 // ファイルの読み込み 81 br = new BufferedReader((new InputStreamReader(is))); 82 String s; 83 while ((s = br.readLine()) != null) { 84 json += s; 85 } 86 Log.d(TAG, json); 87 88 JSONObject jsonObject = new JSONObject(json); 89 90 // 問題データ追加 91 //JSONArray easy = problems.getJSONArray("easy"); 92 ZahyoChanger changer = new ZahyoChanger(); 93 JSONArray normal_problem = jsonObject.getJSONObject("problems").getJSONArray("normal"); 94 for (int i = 0; i < normal_problem.length(); i++) { 95 String value1 = normal_problem.getString(i); 96 changer.GoDataSeparate(value1); 97 Log.d(TAG, "value1は " + value1 + " です!"); 98 } 99 //答えデータ追加 100 //JSONArray easy_answers = answers.getJSONArray("easy"); 101 JSONArray normal_answers = jsonObject.getJSONObject("answers").getJSONArray("normal"); 102 for (int j = 0; j < normal_answers.length(); j++) { 103 String value2 = normal_answers.getString(j); 104 changer.GoDataSeparate(value2); 105 Log.d(TAG, "value2は " + value2 + " です!"); 106 } 107 // realm.commitTransaction(); 108 } catch (IOException | JSONException e) { 109 e.printStackTrace(); 110 // realm.cancelTransaction(); 111 } finally { 112 if (is != null) { 113 is.close(); 114 } 115 } 116 return realm.where(GoData.class).findAll(); 117 } 118 119 private void reloadListView() { 120 121 ArrayList<GoData> goDataArrayList = new ArrayList<>(); 122 123 for (int i = 0; i < results.size(); i++) { 124 Log.d(TAG, String.valueOf(results.size())); 125 126 GoData data = new GoData(); 127 128 data.setId(results.get(i).getId()); 129 data.setQNum(results.get(i).getQNum()); 130 data.setLevel(results.get(i).getLevel()); 131 132 goDataArrayList.add(data); 133 } 134 135 //adapter = new GoDataAdapter(this); 136 adapter.setGoData(goDataArrayList); 137 listView.setAdapter(adapter); 138 adapter.notifyDataSetChanged(); 139 } 140 141 private void addGoData() { 142 143 GoData data = new GoData(); 144 145 for (int j = 0; j < results.size(); j++) { 146 147 data.setId(results.get(j).getId()); 148 data.setQNum(results.get(j).getQNum()); 149 data.setTeban(results.get(j).getTeban()); 150 data.setLevel(results.get(j).getLevel()); 151 152 data.setColP(results.get(j).getColP()); 153 data.setRowP(results.get(j).getRowP()); 154 data.setStoneColorP(results.get(j).getStoneColorP()); 155 data.setColA(results.get(j).getColA()); 156 data.setRowA(results.get(j).getRowA()); 157 data.setStoneColorA(results.get(j).getStoneColorA()); 158 } 159 realm.beginTransaction(); 160 realm.copyToRealmOrUpdate(data); 161 realm.commitTransaction(); 162 } 163}

###補足情報(言語/FW/ツール等のバージョンなど)
言語:Java
開発環境:androidstudio2.2.2
実機OS:android4.4.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

手っ取り早く解決したいのでしたら、RealmConfigurationを設定するときに

java

1RealmConfiguration config = RealmConfiguration.Builder(this).deleteRealmIfMigrationNeeded().build(); 2 3Realm.setDefaultConfiguration(config);

のようにdeleteRealmIfMigrationNeeded()を加えれば解決するはずです。

RealmMigrationNeededExceptionは、Android上でRealmDBを作成した後にカラムの変更などを行った場合に起こる例外ですが、deleteRealmIfMigrationNeeded()を設定しておくことによって、RealmMigrationNeededExceptionが起きた場合にAndroid上に存在しているDBを消して、Exceptionの発生を回避してくれるので開発中はこの設定を入れておくとよいと思います。

ただ公開しているアプリの場合、更新したらユーザーのデータが消えるという事故が起こってしまうのでRealmの公式サイト等を参考にマイグレーションの実装方法を覚えておきましょう。

投稿2016/10/23 11:27

pankuz_list

総合スコア18

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

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

intenseG

2016/10/23 12:27

deleteRealmIfMigrationNeeded()を加えたらエラーが消えました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問