Android 上的 Scala, 实战之路(三)——介个是数据库接口?

[b]三、介个是数据库接口?[/b]

完成了[url=http://nielinjie.iteye.com/blog/1258338]hello world[/url],我便开始学习android的数据库接口。

这里提一下,受到各种文档和资料关于“Android上四大组件”的说法影响,开始一直觉得content provider对于访问数据库是必须的。后来才发现这个理解是错的,正确的理解是:content provider是用于向外发布数据的,只有需要向外提供数据的时候,应用才提供content provider。我汗。
所以对content provider的探索暂时停止了,学习数据库接口。

据说是提供完全的sqlite支持的,然而发现:功能貌似是有的,接口完全似是而非……
可以传入sql语句、放入参数、运行、遍历结果,啥都能做,问题是以一种奇怪的方式。
如果只是转换编程口音,ok,可以忍。问题在于早已依赖于jdbc之上的种种类库,sql template不能用?orm不能用?手写sql字符串拼接?手写各种get set和各种try finally close?我感到在这样的世界生活是很困难的。
于是我几乎要开始写一个jdbc drvier。
幸好找到了这个—— [url]http://code.google.com/p/sqldroid/[/url]。[i]ps:这里提到了Android中没有暴露内建jdbc driver的原因,有兴趣的同学可以看看。[/i]
搞定了基础设施,开始搭建上层建筑。我选择的是scalaQuery([url]http://scalaquery.org/[/url]),小巧实用,强类型的sql dsl和composable的结果处理方式非常合我的胃口。
写了一小段hello world……好吧,这回是hello database。
不出大家所料:[b]无法运行[/b]。
NullpointException抛出。
很快看出了问题,sqldroid并非是一个完全的实现,只实现了比较常使用的方法。而scalaQuery恰恰使用了不那么常用的方法。——感谢开源世界的一切,问题很容易定位并解决。
一般使用preparedStatment进行select,使用的是executeQuery方法,直接获得返回的resultset。但scalaquery不一样,它的select调用execute方法,再调用getResultset得到resultset。于是,在帮sqldroid实现了getResult方法之后,两者和谐了。

[i]ps:此前还有NosuchMethodException(Exception还是Error?记不清楚了。)抛出,是sqldroid使用了较新android api的缘故,调整了所使用的api版本,于是我的模拟器用上了很欢型的android4。[/i]

“hello database”完整代码如下。代码还没有充分体现出scalaQuery的“强类型sql dsl”或者“composable结果处理”,这些后面应该会再做提及。


import org.scalaquery.ql.basic.{ BasicTable => Table }
import org.scalaquery.ql.TypeMapper._
import org.scalaquery.ql._
import android.util.Log
import org.scalaquery.session._
import org.scalaquery.session.Database.threadLocalSession
import org.scalaquery.ql.extended.SQLiteDriver.Implicit._
import android.content.Context
import android.database.sqlite.{ SQLiteDatabase, SQLiteOpenHelper }

class Repository {
val dataPath = "/data/data/net.nielinjie.beautyFans"
val db = Database.forURL("jdbc:sqldroid:" + dataPath + "/main.sqlite", driver = "org.sqldroid.SqldroidDriver")
db.withSession {
try {
SitesDB.Sites.ddl
}
}
object Sites {
def list(): List[String] = {
db.withSession {
(for (s <- Query(SitesDB.Sites)) yield s.name).list
}
}
}
}

object SitesDB {
object Sites extends Table[(Int, String, String, Option[String])]("sites") {
def id = column[Int]("id", O.NotNull)
def name = column[String]("name")
def url = column[String]("url")
def description = column[Option[String]]("description")
def * = id ~ name ~ url ~ description
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值