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

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回答

2695閲覧

Java Realmでタイトルでのソートができません。

sakanasann

総合スコア11

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クリップ

投稿2017/01/20 02:55

編集2017/01/23 00:46

以下のようなコードを書きました。
年月日でのソートはできるようになりましたが、タイトルでのソートができませんでした。

タイトルでのソートを実行すると、何らかのソートをしているように見えますが、タイトルを参照したソートではありません。

繰り返しますが、年月日のソートは正常に動作し、タイトルのソートのみ正常に動作しません。

どうすれば正常に動作するでしょうか?

年月日ソートの正常な動作の定義:【年月日入力欄に入力されている数字を昇順降順に並び替える動作】(こちらは現在正常な動作をしているように見えます)

タイトルソートの正常な動作の定義:
【タイトル欄に入力されている文字を「あいうえお順」または「ABC順」に並び替える動作】(こちらが正常な動作をしていません)

・ソート処理部分(メニューから指定のボタンを押すと動作するようにしています)

Javva

1 public boolean onOptionsItemSelected(MenuItem item) { 2 int id = item.getItemId(); 3 4 if (id == R.id.action_settings) { 5 Realm realm = Realm.getInstance(this); 6 RealmResults<Schedule> schedules = realm.where(Schedule.class).findAll(); 7 schedules.sort("date", Sort.ASCENDING); 8 ScheduleAdapter adapter = new ScheduleAdapter(this, schedules, true); 9 mListView.setAdapter(adapter); 10 Toast.makeText(this, "年月日を参照し昇順に並び替えました", Toast.LENGTH_SHORT).show(); 11 return true; 12 }else if(id == R.id.action_settings2){ 13 Realm realm = Realm.getInstance(this); 14 RealmResults<Schedule> schedules = realm.where(Schedule.class).findAll(); 15 schedules.sort("date", Sort.DESCENDING); 16 ScheduleAdapter adapter = new ScheduleAdapter(this, schedules, true); 17 mListView.setAdapter(adapter); 18 Toast.makeText(this, "年月日を参照し降順に並び替えました", Toast.LENGTH_SHORT).show(); 19 return true; 20 }else if(id == R.id.action_settings3) { 21 Realm realm = Realm.getInstance(this); 22 RealmResults<Schedule> schedules = realm.where(Schedule.class).findAll(); 23 schedules.sort("title", Sort.DESCENDING); 24 ScheduleAdapter adapter = new ScheduleAdapter(this, schedules, true); 25 mListView.setAdapter(adapter); 26 Toast.makeText(this, "タイトルを参照し降順に並び替えました", Toast.LENGTH_SHORT).show(); 27 return true; 28 }else if(id == R.id.action_settings4) { 29 Realm realm = Realm.getInstance(this); 30 RealmResults<Schedule> schedules = realm.where(Schedule.class).findAll(); 31 schedules.sort("title", Sort.DESCENDING); 32 ScheduleAdapter adapter = new ScheduleAdapter(this, schedules, true); 33 mListView.setAdapter(adapter); 34 Toast.makeText(this, "タイトルを参照し降順に並び替えました", Toast.LENGTH_SHORT).show(); 35 return true; 36 } 37 return super.onOptionsItemSelected(item); 38 }

・Scheduleクラス

Java

1public class Schedule extends RealmObject{ 2 @PrimaryKey 3 private long id; 4 private Date date; 5 private String title; 6 private String detail; 7 8 public long getId() { 9 return id; 10 } 11 12 public void setId(long id) { 13 this.id = id; 14 } 15 16 public Date getDate() { 17 return date; 18 } 19 20 public void setDate(Date date) { 21 this.date = date; 22 } 23 24 public String getTitle() { 25 return title; 26 } 27 28 public void setTitle(String title) { 29 this.title = title; 30 } 31 32 public String getDetail() { 33 return detail; 34 } 35 36 public void setDetail(String detail) { 37 this.detail = detail; 38 } 39} 40

・ScheduleAdapterクラス

Javapublic

1 2 private static class ViewHolder { 3 TextView date; 4 TextView title; 5 } 6 7 public ScheduleAdapter(Context context, RealmResults<Schedule> realmResults, boolean automaticUpdate) { 8 super(context, realmResults, automaticUpdate); 9 } 10 11 @Override 12 public View getView(int position, View convertView, ViewGroup parent) { 13 ViewHolder viewHolder; 14 if(convertView == null) { 15 convertView = inflater.inflate(android.R.layout.simple_list_item_2, parent, false); 16 viewHolder = new ViewHolder(); 17 viewHolder.date = (TextView) convertView.findViewById(android.R.id.text1); 18 viewHolder.title = (TextView)convertView.findViewById(android.R.id.text2); 19 convertView.setTag(viewHolder); 20 } else { 21 viewHolder = (ViewHolder)convertView.getTag(); 22 } 23 24 Schedule schedule = realmResults.get(position); 25 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 26 String formatDate = sdf.format(schedule.getDate()); 27 viewHolder.date.setText(formatDate); 28 viewHolder.title.setText(schedule.getTitle()); 29 30 return convertView; 31 } 32}

・ScheduleEditActivityクラスの内容の一部

Java

1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_schedule_edit); 5 mDateEdit= (EditText) findViewById(R.id.dateEdit); 6 mTitleEdit= (EditText) findViewById(R.id.titleEdit); 7 mDetailEdit = (EditText) findViewById(R.id.detailEdit); 8 mDelete = (Button) findViewById(R.id.delete); 9 long scheduleId = getIntent().getLongExtra("schedule_id", -1); 10 if (scheduleId != -1) { 11 Realm realm = Realm.getInstance(this); 12 RealmResults<Schedule> results = realm.where(Schedule.class) 13 .equalTo("id", scheduleId).findAll(); 14 Schedule schedule = results.first(); 15 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 16 String date = sdf.format(schedule.getDate()); 17 mDateEdit.setText(date); 18 mTitleEdit.setText(schedule.getTitle()); 19 mDetailEdit.setText(schedule.getDetail()); 20 mDelete.setVisibility(View.VISIBLE); 21 } else { 22 mDelete.setVisibility(View.INVISIBLE); 23 } 24 25 } 26 public void onSaveTapped(View view) { 27 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 28 Date date = new Date(); 29 try { 30 date = sdf.parse(mDateEdit.getText().toString()); 31 } catch (ParseException e) { 32 e.printStackTrace(); 33 } 34 long scheduleId = getIntent().getLongExtra("schedule_id", -1); 35 if (scheduleId != -1) { 36 Realm realm = Realm.getInstance(this); 37 RealmResults<Schedule> results = realm.where(Schedule.class) 38 .equalTo("id", scheduleId).findAll(); 39 realm.beginTransaction(); 40 Schedule schedule = results.first(); 41 schedule.setDate(date); 42 schedule.setTitle(mTitleEdit.getText().toString()); 43 schedule.setDetail(mDetailEdit.getText().toString()); 44 realm.commitTransaction(); 45 Snackbar.make(findViewById(android.R.id.content), "更新しました" 46 , Snackbar.LENGTH_SHORT) 47 .setAction("戻る", new View.OnClickListener() { 48 @Override 49 public void onClick(View v) { 50 finish(); 51 } 52 }) 53 .setActionTextColor(Color.YELLOW) 54 .show(); 55 } else { 56 Realm realm = Realm.getInstance(this); 57 realm.beginTransaction(); 58 Number maxId = realm.where(Schedule.class).max("id"); 59 long nextId = 1; 60 if (maxId != null) nextId = maxId.longValue() + 1; 61 Schedule schedule = realm.createObject(Schedule.class); 62 schedule.setId(nextId); 63 schedule.setDate(date); 64 schedule.setTitle(mTitleEdit.getText().toString()); 65 schedule.setDetail(mDetailEdit.getText().toString()); 66 realm.commitTransaction(); 67 Toast.makeText(this, "追加しました", Toast.LENGTH_SHORT).show(); 68 finish(); 69

・メニューXML内の指定部分

Java

1<item 2 android:id="@+id/action_settings" 3 android:orderInCategory="100" 4 android:title="@string/action_settings" 5 app:showAsAction="never" /> 6 <item 7 android:id="@+id/action_settings2" 8 android:orderInCategory="100" 9 android:title="@string/action_settings2" 10 app:showAsAction="never" /> 11 <item 12 android:id="@+id/action_settings3" 13 android:orderInCategory="100" 14 android:title="@string/action_settings3" 15 app:showAsAction="never" /> 16 <item 17 android:id="@+id/action_settings4" 18 android:orderInCategory="100" 19 android:title="@string/action_settings4" 20 app:showAsAction="never" />

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

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

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

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

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

fuzzball

2017/01/20 03:01

「正常に動作しません」を具体的に書いて下さい。
guest

回答1

0

ベストアンサー

年月日のソートは、本当に正常に動作しているのでしょうか?

sort()は、ソート結果を返値で返す関数なので、

java

1schedules = schedules.sort("title", Sort.DESCENDING);

としないと、ソート後のデータを取得出来ないと思います。

投稿2017/01/20 06:48

fuzzball

総合スコア16731

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

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

sakanasann

2017/01/23 00:41

年月日ソートについては、動作確認し想定通りの動作をしております。 ただし、今回の開発は私にとってJavaに初めて触れたもののため、Javaプログラム上正しいあるいは相応しいコードかどうかは自信がありません。 また、関係のありそうな部分は全て記載したつもりですが、サンプルコードを改造したものであるため、記載した箇所以外のコードで何かうまく働いているのいかもしれません。 今後のJavaに対する知識発展のため、どのような部分に違和感をもったかお手数でなければお教え願えませんか?
fuzzball

2017/01/23 01:05 編集

回答のように修正してもダメだったのでしょうか? >>どのような部分に違和感をもったか 回答内にも書いていますが、sort()は返値で結果を返す関数で、schedulesの中身を書き変える関数ではありません。(と私は思っています) >>年月日ソートについては、動作確認し想定通りの動作をしております。 降順も昇順もですか?だとすると、私のsort()に関する認識が間違っているということになります。 >>Javaに初めて触れたもののため Java以外で使える言語は何でしょうか?プログラム自体が初めてなのでしょうか?
sakanasann

2017/01/23 01:47 編集

schedules = schedules.sort("title", Sort.DESCENDING); と最初はしていましたが、エラーが出ました。 schedules = schedules.sort("date", Sort.DESCENDING); としていた年月日のほうも同様にエラーがでていました。 その時はたまたま情報系専門学校教師の方に質問できたので、修正を依頼したところ質問本文のコードのように修正され正常に動作するようになりました。 しかし、タイトルでのソートのほうは正常に動作しなかった。とのことでした。 実際に動作させてみてもその通りでした。 こちらの原因がわかっていない状態です。 その方もJavaの専門でなく、Realmも扱ったことがないようでしたので、これ以上はわからないといった様子でした。 なお、私はC言語での小さなプログラム開発(教科書の題材にされている程度のもの)は行ったことがありますが、今回ほどの規模の大さのプログラムは、言語に関わらずはじめてです。
fuzzball

2017/01/23 01:54

Realmのバージョンを教えていただけるでしょうか?
sakanasann

2017/01/23 02:08 編集

realm-android-0.87.5のはずです 別の方のRealmのバージョンが古いのではないかとの助言から、初期状態の0.85.1からファイルの入れ替えにより更新しました。
sakanasann

2017/01/23 02:12

記載忘れです 年月日は昇順降順 共に正常な動作をしております。
fuzzball

2017/01/23 02:16 編集

それはちょっと古過ぎると思います。(一年ほど前のバージョンです) 最新は.2.3.0で、私は2.2.2で検証しました。 必要であれば0.87.5で検証してみますが、どうしましょうか?
sakanasann

2017/01/23 02:22

こちらで最新版に更新して検証してみます 0.87.5にした理由はその方から0.87.5のRealmを渡された為ですので、特にこのバージョンでなければならない理由は現時点ではありません。
sakanasann

2017/01/23 02:56

realm-android-0.87.5.jarファイルを直接頂き、それをそのまま指定フォルダ内に入れる方式で導入していましたが、公式サイトからダウンロードしたフォルダの中身に同様のjarファイルが見当たりませんでした。 これはどのようにAndroidstudioに導入すればよいのでしょうか? 検索してみても、Realmを導入した後のことや、違う統合開発環境での説明ばかりでくるため、Androidstudioでの導入方法がわかりません。
sakanasann

2017/01/25 03:00 編集

classpath "io.realm:realm-gradle-plugin:2.3.0" と書き換えましたが、ソート実行時に変化はありませんでした。 なお、書き換えたことによるエラーは無く、その他の異常も無いように見えます。 その他、説明で書き加えるべきとされていた内容は、サンプルソースの初期状態から存在しましたので変更を加えていません。
sakanasann

2017/01/25 03:07

Androidstudioを再起動しましたところ、タイトルの降順ソートのみ正常に動くようになりましたが、昇順ソートに割り当てているボタンを押しても降順にソートされてしまいます。 昇順ソートを実行 → 降順にソートされる 降順ソートを実行 → 降順にソートされる と、なりました。 年月日ソートについては、依然と変わらず正常な動作をしています。
sakanasann

2017/01/25 03:14 編集

書き換えたはずのコードが一部以前の状態に戻っていたようです。 修正したら正常に動作するようになりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問