我是Play Framework和Scala语言的新手。我想只通过运行带有指定参数的URL将一些数据保存到数据库。 例如,我想运行url,如:
/ DeviceData DEVICE_ID = 1&安培; insertDate = 2013-01-01&安培; windDirection = 50&安培; DEVICE_ID = 1&安培; insertDate = 2013年1月2日和安培; windDirection = 5
然后在数据库中插入两个新记录(使用Device_ID,insertDate和windDirection)。 现在我正试图一次只保存一条记录(我不知道如何阅读元素列表并保存它们)但事件是它无法正常工作。没有错误,它只是没有插入。
DeviceData模型
case class DeviceData(data_ID: Long, device_ID: Long, insertDate: String, windDirection: Double)
object DeviceData{
var deviceDataList = new HashMap[Long, DeviceData]
var data_ID = 0L
def nextId(): Long = { data_ID += 1; data_ID}
def createDeviceData(device_ID: Long, insertDate: String, windDirection: Double) :Unit = {
DB.withConnection { implicit connection =>
SQL(
"""
INSERT INTO devicedata(device_ID, insertDate, windDirection)
VALUES ({device_ID}, {insertDate}, {windDirection})
"""
).
on("device_ID" -> device_ID, "insertDate" -> insertDate, "windDirection" -> windDirection).
executeInsert()
}
}
def list(): List[DeviceData] = { deviceDataList.values.toList }
}
DeviceDatas控制器
object DeviceDatas extends Controller {
val deviceDataForm = Form(
tuple(
"device_ID" -> of[Long],
"insertDate" -> nonEmptyText,
"windDirection" -> of[Double]
)
)
def listDeviceData() = Action {
Ok(views.html.deviceData(DeviceData.list(), deviceDataForm))
}
def createDeviceData(device_ID: Long, insertDate: String, windDirection: Double) = Action { implicit request =>
deviceDataForm.bindFromRequest.fold(
errors => BadRequest(views.html.deviceData(DeviceData.list(), errors)),
{ case (device_ID, insertDate, windDirection) => {
DeviceData.createDeviceData(device_ID, insertDate, windDirection)
Redirect(routes.DeviceDatas.listDeviceData)
}
}
)
}
}
deviceData.scala.html - 这很简单,只是为了检查是否有新的插入记录。
@(deviceDatas: List[DeviceData], deviceDataForm: Form[(Long, String, Double)])
@import helper._
@main("DeviceDatas"){
<h3>@deviceDatas.size DeviceData(s)</h3>
}
/ deviceDatas
的路由文件 GET /deviceDatas controllers.DeviceDatas.listDeviceData
POST /deviceDatas controllers.DeviceDatas.createDeviceData(device_ID: Long, insertDate: String, windDirection: Double)
你能帮我解决一下如何将数据插入数据库,以及是否有可能放入包含少量记录的元素列表。在Play Framework中将DateTime(yyyy-MM-dd hh:mm:ss)插入URL参数的最佳方法是什么?我被困住了,我不知道该怎么做。
已更新
感谢Zim-Zam O'Pootertoot的答案。不幸的是我需要使用参数,因为我通过路由器发送数据。但无论如何还要多谢你,因为我将来会使用json。 我决定不使用前面所说的参数列表,但是对于一个新记录我发送一个请求(例如:向数据库添加6条新记录,我需要在路由器上运行6次URL:
/DeviceData?device_ID=1&insertDate=2013-01-01&windDirection=50
我的问题通过将路径文件更改为:
来解决GET /deviceDatas controllers.DeviceDatas.listDeviceData
GET /deviceDatas controllers.DeviceDatas.createDeviceData(device_ID: Long, insertDate: String, windDirection: Double)
答案 0 :(得分:0)
要传递多个记录的数据,并传入DateTime数据,请在请求的json正文中发送数据而不是url params
http://www.playframework.com/documentation/2.2.x/ScalaBodyParsers
http://www.playframework.com/documentation/2.2.x/ScalaJson
Action(parse.json) { implicit request =>
(request.body \ "records") match {
case arr: JsArray => arr.value.foreach(json => {
val deviceId = (json \ "device_ID").as[Long]
val date = (json \ "insertDate").as[String]
val windDirection = (json \ "windDirection").as[Double]
// insert data in database
})
case _ => throw new IllegalArgumentException("Invalid Json: records must be a JsArray")
}}
您的记录的json可能类似于
{"records" : [
{"device_ID" : 123, "insertDate" : "2014-03-01 12:00:00", "windDirection" : 123.45},
{"device_ID" : 456, "insertDate" : "2014-03-02 12:00:00", "windDirection" : 54.321}]}