無題

電気科の学生がお笑いとお酒と旅行の記事を書きます(つもり)

【Realm】LinkingObjectについて

はじめに

ここ最近Kotlin使ってAndroidアプリ開発を数日やらせてもらいましたが、そのなかでrealmというデータベースを使う機会がありました。
いろいろな機能があるんですが、なかでも```LinkingObject```というものが、便利なんですが初めましての私には少々難解に思えたため、自分用に後で見直せるように解説を軽く書き記しておきます。

LinkingObgectとは

まず、realmを使うにあたり、Database用のclassを作成します。
で、異なる二つのクラスをつなげたい、関連性を持たせたい、というときがあるわけです。
例えば、「犬」と「飼い主」で考えたとしましょう。
それぞれの犬には、「色」や「年齢」、「名前」などの特徴があり、飼い主にも「名前」「性別」「年齢」...などの特徴があるわけです。
この2つのクラスを引っ付けるために、LinkingObjectを使います。

たとえば、こんな感じ。

//飼い犬
open class Dog : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var color:String = ""
    var age: Int = 0
}

//飼い主
open class Owner : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var sex: Int = 0 //male
    var age: Int = 0
}

これは、まだ両者の情報を紐づけできていません。
紐づけするには、こうやります。

//飼い犬
open class Dog : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var color:String = ""
    var age: Int = 0
    var owner: Owner? = null
}

//飼い主
open class Owner : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var sex: Int = 0 //male
    var age: Int = 0

    @LinkingObjects("owner")
    val dogs RealmResults<Dog>? = null
}

今回は、飼い主さんのほうにLinkingObjectを追加しました。
これは、こんな関係になってるみたいです。
「飼い主から犬は『dogs』というプロパティでみえ、犬から飼い主は『owner』というプロパティで見える」
ちょっとわかりづらいかもしれません...すみません

変わって、画像で説明します。
例えば、今こう言うデータが登録されているとします。

f:id:waewae96:20181014204636p:plain

同じ色の大きな四角で囲まれているものが、飼い主と飼い犬の関係にあります。AikoさんはLoveちゃんを飼っていますし、KenjiさんはLonくんとYukiちゃんを飼っています。この「飼う飼われる」の関係を紐づけたいわけです。で、上記のやり方で紐づけて、保存できたとします。紐づけ方は基本的なプロパティの使い方と同じようにしてやればよいです。

呼び出し方

私が一番詰まったのは呼び出し方で、特に、Linkされた側からの呼び出し。例えば、「Loveちゃんの年齢」が欲しいときには、普通に

     val love = realm.where<Dog>().equalTo("name", love).findFirst()
     val loveAge = love.age

でいいわけですが、じゃあ言い方を変えて、「Aikoさんの飼い犬の年齢」が欲しいときは、どうすればよいのか、で初心者の私はつまづいたわけです、詳しいリファレンスがないので...

で、いろいろやってみた結果こうしたらうまくいきました

     val dog = realm.where<Dog>().equalTo("owner.name", Aiko).findFirst()
     val dogAge = dog.age

というか、冷静に考えればそうだよな、「Dog」Classの「owner」プロパティがその犬の飼い主だもの。
ほかの言語で考えればそうなのですが、Kotlinだしrealmだし、しかもLinkingObject知らねえしで身構えちゃうとこういうミスをおかしがちなのかもしれません...ね。

Kotlinつかってアプリ開発(自分用メモ)

いろいろあってKotlin使用してAndroidアプリ開発をすることになったのです...

共同作業で私はほぼ何もしてないようなもんですが、何はともあれ楽しいもんだ

 

この記事については、まだ多くのReferenceがないKotlinを使うにあたり、いろいろと参考にさせていただいたサイトをバシバシ貼っていくだけという完全に自分用の記事です。ご了承いただければ。

 

では以下から。

 

TextViewもsetOnClickListener()使えるっていうアレ

www.tutorialkart.com

 

カレンダー形式で日付ダイアログだすやり方(Kotlin)

www.tutorialkart.com

 

ポップアップで出てくる表示をダイアログというんだそう。

ほかに、ダイアログ関連で、ConfirmDialog(勝手に名前つけました)。

 

joyplot.com

こっちのAlterDialogのほうが使えた

android--code.blogspot.com

ちょこちょこ見えるけど、

Toast.makeText(applicationContext,"...", ,Toast.LENGTH_SHORT).show()

みたいなのが、あの一瞬画面に浮いてくるアラートなんだろうな。

 

・never used と言われましても...

stackoverflow.com

 他です

How to call Main Activity method in another class in Android - Quora

 

・LINEみたいにListViewの端に画像を配置する方法

ListViewを使用してリストを表示する

 

・スピナーの使い方

gacken.com

stackoverflow.com

stackoverflow.com

・現在時刻の取得

android.techblog.jp

 

・DatePickerの使い方

tech.pjin.jp

akira-watson.com

www.tutorialkart.com

 

・オブジェクトの条件検索、数の取得

realm.io

 

・equalTo()でエラーが出る件

qiita.com

 

・別ActivityからあるActivityのUI操作、など。一番時間かかったとこ...なのでReferenceもめっちゃ多いです

dev.classmethod.jp

joyplot.com

qiita.com

akira-watson.com

android.roof-balcony.com

qiita.com

 

最終的に私のミスに関係していたのはこれでした。

stackoverflow.com

僭越ながら自己解決法を軽く乗せたteratailもひっぱっておきます

teratail.com

 

 

Android StudioのTips

・超便利なInstant Run

nonylene.hatenablog.jp

 

まだ完成という歓声ではないですが普通に中学の時htmlいじってたの思い出して楽しかったし、いろいろ興味がわいたのでRealmもうちょっと勉強しようと思います。

 

追記

やり直しをするにあたって参考サイトが増えたので以下。

 

realm.io

ja.stackoverflow.com

realm.io

 

めちゃめちゃ有益そうなサイト見つけました

tech.mokelab.com

Git始めました。

お久しぶりです。
表題の通り、GitもといGitHubを本格的に使用することになりました。
理由としてはあるプロジェクトに首を突っ込んで(突っ込まさせていただいて)、どうしてもGitが必要になったので、ということです。というかGitがないと進まないよね、開発。
ということでインストールからすすめましたが、初心者がいろいろ書けるわけじゃないので自分用に参考にさせてもらったサイトを掲載させていただくのみとします。

GitのインストールからGitHubとの連携まで

employment.en-japan.com

※今回、chmodコマンドを用いた権限変更はWindowsでは必要ない(というか、600にできない)らしので、すっとばしました。

エラー

上記のサイト通りに進めるといくつかエラーが出たので、ちょっと直しました。

git cloneができない

サイトの通りにgit cloneしようとしたところ、

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

上記のようなエラーが出たので、色々調べたところ、ssh-addしていなかったようなので、いれました。

ssh-add ~/.ssh/id_rsa(鍵の名前)

qiita.com

こちら、参考にさせていただきました。



途中でvimを使う場面(というか、使っている場面)があったのでいい機会だと思い、入れました。

qiita.com

上記のサイトを参考にしました。

追記

pushだのpullだのそこら辺がよくわかっていなかったのですが死ぬほどわかりやすく解説している記事を発見したので貼ります。お世話になりっぱなしじゃ...
tracpath.com

覚え書き(C++)

よく遊んでいる分には忘れないのですが、ちょっと離れると忘れてしまうので覚え書きです。

文字列と数字

文字列と数字への相互変換はこのようになります。

string str = "123456";
  int num = 2018;

  /*string → int*/
  int a = stoi(str);

  /*string → double*/
  double b = stod(str);

  /*int → string*/
  string c = to_string(num);

  /*stringを1文字ずつ使う*/
  char d = str[0];
  int i = d - '0';

数字は、'0'を引くことに注意です。

ABC106

前書き

こんばんは。
さて、私は競プロ部の幽霊部員として2年半やってきたわけです。
言い訳するなら、プログラミングをいざ始めると他のことが手につかなくなるので薬みたいなもんかなと思って怖くて手が出せずにいたわけです。
ただ、そろそろ言い訳をしているわけにも行かなくなったのと、もうそろそろチャレンジできる力がついたのかな(ついたことを願いたい)というのと、矛盾しますが色々な面で力不足を感じたため、再出発です。まずはコンテストから始めて見ましょうや。ということで。
3度目の挑戦(遅い!)

ABC106

問題リンクは以下。
AtCoder Beginner Contest 106 - AtCoder

A - Garden

中学数学とかでやったことのある問題です。
(全体)-(道2本)+(道の重なった部分)
つまり
A * B - (A + B) + 1
ですよね。ということで。AC。

#include <iostream>
#include <cmath>
using namespace std;

int main(){
int A, B;
cin >> A >> B;
cout << A*B-A-B+1 << endl;
return 0;
}
B - 105

わかりにくいのですが、

・自分自身も約数に含む
・自分以外の約数は全て自分 / 2 以下の数

上記2点を踏まえて、

・約数の数の初期値は1
・自分 / 2 の数まできたら計算終了

ということにしました。記憶が飛んで初期値1にするのを忘れてカッコつけられなかった。AC。

#include <iostream>
using namespace std;

int main(){
  int N, n = 1, counter, ans = 0;
  cin >> N;
  while(n <= N){
    counter = 1;
    for(int i = 1; i < n/2; i++){
      if(n % i == 0)  counter++;
    }
    if(counter == 8)  ans ++;
    n += 2;
  }
  cout << ans << endl;
  return 0;
}
C - To Infinity

overflowとかTLEとお友達の初心者なので、「5000兆」の文字を見たときは半ば諦めモードでしたが、
よくよく考えてみると2^(5000兆) >> 10^18なので、
1以外が現れるかそうでないかで場合分けすれば良いのです。なぁんだ。AC出来て嬉し嬉し。

#include <iostream>
#include <string>
using namespace std;

int main(){
    string S;
    long long int K, sum = 0, s;
    cin >> S >> K;
    for(long long int i = 0;i < (long long int)S.size(); i++){
      s = S[i] - '0';
      if(s == 1)  sum++;
      else  break;
    }
    if(K <= sum)  cout << 1 << endl;
    else cout << s << endl;
    return 0;
}
D - AtCoder Express 2

真面目にやろうとしてTLEになる
→LiをソートしてLi < pjになったらカット、とかすればいいんじゃね?→もちろんTLE(なんならWAしてしまった)
解説読んでなんとなく理解した気がするので明日、というか今日解説ACなるものしてみようと思います。

累積和について

累積和というワードを初めて知ったので(恥ずかしい)軽く。
要は、「累積和計算」という前処理をすることで、全体の計算量を減らすことができる、という利点があるみたいです。
こちらのありがたい記事を参照しました。
paiza.hatenablog.com

今回は、Li と Ri という2つのパラメータがあるので、二次元平面で累積和を考えてみました。

・まず、LiとRiをパラメータとして、二元配列にどんどん足していきます
・次に、累積和をcとして、求めます。
・最後に、累積和を利用して計算します。p = 1かどうかでの場合分けも忘れずにやりましょう。p = 1の時には引き算は必要ありませんからね。

#include <iostream>
#include <vector>
using namespace std;

int main(){

  int N, M, Q, counter, L, R;
  cin >> N >> M >> Q;
  int p[Q], q[Q];
  int train[N][N], c[N][N];
  for(int i = 0; i < N; i++){
    for(int j = 0; j < N; j++){
      train[i][j] = 0;
      c[i][j] = 0;
    }
  }

  /*累積和*/
  for(int i = 0; i < M; i++){
    cin >> L >> R;
    train[L-1][R-1]++;
  }
  for(int i = 0; i < N; i++){
    for(int j = 0; j < N; j++){
      if(j == 0)
        c[i][j] = train[i][j];
      else
        c[i][j] = c[i][j-1] + train[i][j];
    }
  }
  /*累積和ここまで*/

  for(int i = 0; i < Q; i++){
    cin >> p[i] >> q[i];
  }

  for(int i = 0; i < Q; i++){
    counter = 0;
    for(int j = p[i] - 1; j < q[i]; j++){
      if(p[i] - 2 >= 0)
        counter += (c[j][q[i] - 1] - c[j][p[i] - 2]);
      else
        counter += c[j][q[i] - 1];
    }
    cout << counter << endl;
  }
  return 0;
}

解説AC出来た!
満足したのでこのまま下宿先へ帰ります。

PCが壊れました

えー、こんにちは。表題の通りです。一台壊れました。Mac book Air 2016春モデル。今のところはまだ「壊れた疑惑」ですが。

 大学のアプリコンテストに出場することになったため、とりあえず準備をと思いまして、手始めにとAndroid Studioをインストールしようとしたのです。全くうまくいかず...

 Macでインストールができないなんて不具合あるのか!と思いつつ色々相談なり実行なりして見た結果、どうもHDDが壊れて書き込みができなくなっているようです。ありゃりゃ...

 個人的には、「2年半くらい働いてくれたしいいや」と思いましたので、思い切って買い換えることにしました。ノートPCで2年働けば十分でしょう。だいぶ酷使してしまった気もするし。

 

ということで、新しく買おうと色々調べました。個人的な条件としては

 

・メモリ:8GB

・(できれば)SSD 512GB

・1.5kg以下

 

上記3点に絞って探しました。

するといいWindows PCが見つかったので早速購入。こちらです。

 

www.mouse-jp.co.jp

 

メモリは先輩からのアドバイスで急遽カスタマイズで16GB積みました。

さらに(生意気にも)冷却ファンを追加購入(2,000円と少し。安っ!)して、送料込み込み12万くらいだったから大したものです。

 

来週海外に行っちゃうのでそれまでに届くことを願うまでですm(_ _)m

 

ブログ開設しました

ブログ開設しました。

特に大きくこれを書こうと言ったテーマがないのでごちゃごちゃしてきそうですがカテゴリ分けして見やすくしていこうと思います。

よろしくお願いします。