最近スマホアプリを作ってます。詳しい内容は言えないのですが、上記のタイトルの通り自作のデータベースにあるデータを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!!”)//取得失敗時}
})
}
}
これで実行すれば…
食品名や栄養素が表示されました。これで、様々なデータベース関連のアプリケーションが作れます。ありがとうございました。
Pingback: Kotlin+Couroutine – pythonで生きていく