이전에 작성했던 코인 API불러오는 방법에 이 해당 코인을 ROOM DB에 저장하도록 하겠다.
https://jejublog94.tistory.com/29
빗썸 코인 리스트 가져오기 API 불러오기 통신하기
해도해도 헷갈리는 API통신 오늘이야 말로 정리하고야 말겠다. 가져온 API 링크 https://api.bithumb.com/public/ticker/ALL_KRW 총 파일은 아래 이미지와 같이 필요하다. 원래는 뷰모델도 사용하지 않고 냅다
jejublog94.tistory.com
앞서 코드는 아래 링크에 있다.
https://github.com/AnMyungwoo94/API_test
GitHub - AnMyungwoo94/API_test
Contribute to AnMyungwoo94/API_test development by creating an account on GitHub.
github.com
빌드 그레들에 아래 추가
// ROOM
def roomVersion = "2.4.1"
implementation("androidx.room:room-runtime:$roomVersion")
annotationProcessor("androidx.room:room-compiler:$roomVersion")
// To use Kotlin annotation processing tool (kapt)
// kapt("androidx.room:room-compiler:$roomVersion")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$roomVersion")
① InterestCoinEntity 데이터 테이블 정의하기
@Entity(tableName = "Interest_coin_table")
data class InterestCoinEntity(
@PrimaryKey(autoGenerate = true)
val id : Int,
val coin_name : String,
val opening_price : String,
val closing_price : String,
val min_price : String,
val max_price : String,
val units_traded : String,
val acc_trade_value : String,
val prev_closing_price : String,
val units_traded_24H : String,
val acc_trade_value_24H : String,
val fluctate_24H : String,
val fluctate_rate_24H : String,
)
② InterestCoinDAO 정의하기
@Dao
interface InterestCoinDAO {
// getAllData
// Flow 데이터의 변경 사항을 감지하기 좋다
@Query("SELECT * FROM interest_coin_table")
fun getAllData() : Flow<List<InterestCoinEntity>>
// Insert
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(interestCoinEntity: InterestCoinEntity)
// update
// 사용자가 코인 데이터를 선택했다가 다시 취소할 수도 있고, 반대로 선택안된 것을 선택할 수도 있게 함
@Update
fun update(interestCoinEntity: InterestCoinEntity)
// getSelectedCoinList -> 내가 관심이어한 코인 데이터를 가져오는 것
@Query("SELECT * FROM interest_coin_table WHERE selected = :selected")
fun getSelectedData(selected : Boolean = true) : List<InterestCoinEntity>
}
③ CoinPriceDatabase생성 후 InterestCoinDAO 와 이어준다.
@Database(entities = [InterestCoinEntity::class], version = 2)
abstract class CoinPriceDatabase : RoomDatabase() {
abstract fun interestCoinDAO(): InterestCoinDAO
companion object {
@Volatile
private var INSTANCE: CoinPriceDatabase? = null
fun getDatabase(
context: Context
): CoinPriceDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
CoinPriceDatabase::class.java,
"coin_database" //DB Name
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
}
}
}
④ DBRepository를 만들어서 다른곳에서 간편하게 사용할 수 있도록 만들어준다.
class DBRepository {
val context = App.context()
val db = CoinPriceDatabase.getDatabase(context)
// InterestCoin
// 전체 코인 데이터 가져오기
fun getAllInterestCoinData() = db.interestCoinDAO().getAllData()
// 코인 데이터 넣기
fun insertInterestCoinData(interestCoinEntity: InterestCoinEntity) =
db.interestCoinDAO().insert(interestCoinEntity)
// 코인 데이터 업데이트
fun updateInterestCoinData(interestCoinEntity: InterestCoinEntity) =
db.interestCoinDAO().update(interestCoinEntity)
// 사용자가 관심있어한 코인만 가져오기
fun getAllInterestSelectedCoinData() = db.interestCoinDAO().getSelectedData()
}
⑤ 이제 코인 데이터를 저장할 dataModel을 만들어준다.
[ 나는 2개를 만들었다, 왜? 내가 원하는대로 저장하기 위해 ]
내 이전 포스팅을 보면 알겠지만 아래 사진과 같이 API가 저장되어 있다.
파란색 박스에 담긴 값을 data class CurrentPrice에 넣을거고 이 값을 사용해서 데이터 클래스를 하나 더 만들거다.
이건 빨간색 박스에 있는 코인 이름과 CurrentPrice 의 값을 담을 data class CurrentPriceResult을 만들어줬다.
즉, 나는 이 코인을 저장하기 위한 dataClass가 2개란 말이다.
data class CurrentPrice(
val opening_price : String,
val closing_price : String,
val min_price : String,
val max_price : String,
val units_traded : String,
val acc_trade_value : String,
val prev_closing_price : String,
val units_traded_24H : String,
val acc_trade_value_24H : String,
val fluctate_24H : String,
val fluctate_rate_24H : String
)
data class CurrentPriceResult(
val coinName : String,
val coinInfo : CurrentPrice
)
⑥ ViewModel에 저장해준다.
그럼 코인리스트가 Room에 촤라라락 저장된다.
밑에 작성된 코드는 이전 포스팅을 보고 와야 이해가 될것이다.
class MainViewModel : ViewModel() {
private val netWorkRepository = NetWorkRepository()
private val dbRepository = DBRepository()
private lateinit var currentPriceResultList: ArrayList<CurrentPriceResult>
fun getCurrentCoinList() = viewModelScope.launch {
val result = netWorkRepository.getCurrentCoinList()
// Log.e("코인리스트 가져오기",result.toString())
currentPriceResultList = ArrayList()
//데이터 내가 원하는대로 가공하기
for (coin in result.data) {
try {
val gson = Gson()
val gsonTogson = gson.toJson(result.data.get(coin.key)) // 저장된 값들
// Log.e("코인키", result.data.get(coin.key).toString())
val gsonFromJson = gson.fromJson(gsonTogson, CurrentPrice::class.java)
val curremtPriceResult = CurrentPriceResult(coin.key, gsonFromJson)
// Log.e("코인테이터2",curremtPriceResult.toString())
currentPriceResultList.add(curremtPriceResult)
// Log.e("코인 저장", currentPriceResultList.toString())
} catch (e: java.lang.Exception) {
}
}
saveCoinList()
}
fun saveCoinList() =
viewModelScope.launch(Dispatchers.IO) {
for (coin in currentPriceResultList) {
val interestCoinEntity = InterestCoinEntity(
0,
coin.coinName,
coin.coinInfo.opening_price,
coin.coinInfo.closing_price,
coin.coinInfo.min_price,
coin.coinInfo.max_price,
coin.coinInfo.units_traded,
coin.coinInfo.acc_trade_value,
coin.coinInfo.prev_closing_price,
coin.coinInfo.units_traded_24H,
coin.coinInfo.acc_trade_value_24H,
coin.coinInfo.fluctate_24H,
coin.coinInfo.fluctate_rate_24H,
)
//저장하기
interestCoinEntity.let {
dbRepository.insertInterestCoinData(it)
}
}
}
}
RoomDB 까지 한 코드는 아래 깃허브에 넣어두도록 하겠다.
https://github.com/AnMyungwoo94/Room_Test
GitHub - AnMyungwoo94/Room_Test
Contribute to AnMyungwoo94/Room_Test development by creating an account on GitHub.
github.com
'안드로이드앱' 카테고리의 다른 글
안드로이드 코틀린 프로젝트 날씨앱 만들기! (2) | 2023.11.13 |
---|---|
안드로이드 코틀린 결제창 연동! Bootpay 이니시스 테스트 모드 (1) | 2023.10.31 |
빗썸 코인 리스트 가져오기 API 불러오기 통신하기 (1) | 2023.10.18 |
안드로이드 스튜디오 Sqlite 혹은 Room 파일 erd만들기 (0) | 2023.10.09 |
SDK33 permission 외장메모리 AUDIO 승인 대응하기 (0) | 2023.10.06 |