Kotlin+Oracleでデータ検索API[KotlinでAndroid]

最近スマホアプリを作ってます。詳しい内容は言えないのですが、上記のタイトルの通り自作のデータベースにあるデータをAPIでゲットしてアプリ上で使う必要がでてきました。

今回行ったことは

  • データベース作成(Oracle Database Cloud)
  • APIを作成し、上記のデータベースからデータ取得
  • 上記のAPIでスマホからリクエストしてゲット(Kotlin+retrofit2)

やることは3つありますが、上記2つはこちらのサイトで行えます。

この記事では食品の栄養素がまとまったCSVデータをデータベース化して、API作成までしてくれています。データを自分の好みに合わせれば同じことができるはずです。

上2つが終了すれば、

https://apex.oracle.com/pls/apex/あなたのワークスペース名/food/ハンバーグ

と検索すれば、json形式でデータが取得できるようになっているはずです。

先ほどの記事ですと食品の栄養素が返ってきます。

では、スマホ上でこのURLにリクエストしてデータを取得します。

まず、ネットアクセスできるように AndroidManifest.xmlにて許可を取る。

<uses-permission android:name=”android.permission.INTERNET” />

次にretrofit2を導入します。(build.gradle)

compile ‘com.squareup.retrofit2:retrofit:2.3.0’
compile ‘com.squareup.retrofit2:converter-gson:2.3.0’

受け取るデータのModelクラスを作成します。今回はitemsに食品の栄養素がリストで入っているのでこんな感じです。(OracleAPIData.kt)

data class OracleAPIData(val items: List<Items>)
data class Items(
 var category: Int,//使う栄養素の名前だけでよい
 var food_id: Int,
 var food_name: String,
 var calories: Int,
 var water: String,
 var protein: String,
 var fat: String,
 var cholesterol: String,
 var carbohydrate: String,
 var fiber: String)

次にAPIを定義します。今回はゲットだけですので、シンプルにこれだけ。「food_name」に検索する食品名をいれます。(API_interface.kt)

import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path

interface API_interface {
 @GET(“pls/apex/applications/foods/{food_name}”)
 fun API(@Path(“food_name”) food_name: String):Call<OracleAPIData>}

MainActivity.ktはこんな感じです。表示するためのテキストビューの宣言とRetrofit2を使うための記述だけです。レイアウトもこれに合わせて作りましょう

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.Retrofit
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class MainActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_main)
 var text_food_name = findViewById(R.id.food_name) as TextView
 var text_calories = findViewById(R.id.calories) as TextView
 var text_water = findViewById(R.id.water) as TextView
 var text_protein = findViewById(R.id.protein) as TextView
 var text_fat = findViewById(R.id.fat) as TextView
 var text_carbohydrate = findViewById(R.id.carbohydrate) as TextView
 var text_cholesterol = findViewById(R.id.cholesterol) as TextView
 var text_fiber = findViewById(R.id.fiber) as TextView

 var retro = Retrofit.Builder()
  .baseUrl(“https://apex.oracle.com/”)
  .addConverterFactory(GsonConverterFactory.create())
  .build()

 var service = retro.create(API_interface::class.java)
 var nutrition= service.API(“ハンバーグ”)//検索する食品名
nutrition.enqueue(object : Callback<OracleAPIData> {

override fun onResponse(call: Call<OracleAPIData>, response: Response<OracleAPIData>) {
 val foods = response.body()
 text_food_name.text = “食品名:” + foods!!.items!![0].food_name
 text_water.text = “水分:” + foods!!.items!![0].water
 text_calories.text = “カロリー:” + foods!!.items!![0].calories.toString()
 text_protein.text = “タンパク質:” + foods!!.items!![0].protein
 text_fat.text = “脂質:” + foods!!.items!![0].fat
 text_cholesterol.text = “コレステロール:” + foods!!.items!![0].cholesterol
 text_carbohydrate.text = “炭水化物:” + foods!!.items!![0].carbohydrate
 text_fiber.text = “食物繊維:” + foods!!.items!![0].fiber}
 override fun onFailure(call: Call<OracleAPIData>, t: Throwable) {
  Log.d(“Tag”,”failed!!”)//取得失敗時}
})
}
}

これで実行すれば…

食品名や栄養素が表示されました。これで、様々なデータベース関連のアプリケーションが作れます。ありがとうございました。

Sponsored Link

One thought on “Kotlin+Oracleでデータ検索API[KotlinでAndroid]

  1. Pingback: Kotlin+Couroutine – pythonで生きていく

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です