我已经将示例程序从 Java/SQLite 转换为 Kotlin/Room。
我正在努力在后台线程中实现具有返回值的查询。
这已被问到,但我无法让它工作。 我已经阅读了类似问题的答案,但有些已被弃用,或者某些解决方案对于应该微不足道的事情来说似乎很复杂。
当我需要使用查询的返回值时,我真的很难想出一个简单的解决方案。
(如果我强制在主线程中使用 allowMainThreadQueries() 进行查询,一切都会正常进行)
这是我希望在后台线程中执行查询的功能之一:
fun getCrimes(): List<Crime> {
val crimes = crimesDAO.getAllCrimes() as ArrayList<Crime>
return crimes
}
我可以像下面这样调用该函数并且它可以工作,但这意味着我需要在其他类中添加异步调用并且它看起来并不优雅:
AsyncTask.execute {
mCrimes = getCrimes() as ArrayList<Crime>
}
==> 我想修改 getCrimes 本身,让它在后台运行查询,例如:(后面是不正确的代码)
fun getCrimes(): List<Crime> {
var crimes: ArrayList<Crime>
AsyncTask.execute {
crimes = crimesDAO.getAllCrimes() as ArrayList<Crime>
}
return crimes // This is wrong as crimes in not initialized
}
我研究了 kotlin 协程、实时数据和 rxjava,但找不到解决此问题的简单方法。
这是数据类:
@Entity(tableName = "crimes_table")
class Crime {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name="id")
var id: Long = 0
@ColumnInfo(name="uuid")
@TypeConverters(UUIDConverter::class)
var mId: UUID = UUID.randomUUID()
@ColumnInfo(name="title")
var mTitle: String? = null
@ColumnInfo(name="date")
@TypeConverters(DateConverter::class)
var mDate: Date? = Date()
@ColumnInfo(name="solved")
var mSolved: Boolean = false
}
这是 DAO:
@Dao
interface CrimesListDAO {
@Query("SELECT * FROM crimes_table")
fun getAllCrimes(): List<Crime>
@Query("SELECT * FROM crimes_table WHERE uuid = :uuidString LIMIT 1")
fun getOneCrime(uuidString: String): Crime
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertCrime(crime: Crime)
@Update(onConflict = OnConflictStrategy.REPLACE)
fun updateCrime(crime: Crime)
@Delete
fun deleteCrime(crime: Crime)
}
这是 DatabaseApp 类:
@Database(entities = [(Crime::class)], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun crimesListDAO(): CrimesListDAO
}
这是我实例化数据库的方式:
class ApplicationContextProvider : Application() {
...
companion object {
var database: AppDatabase? = null
...
}
override fun onCreate() {
super.onCreate()
ApplicationContextProvider.database = Room.databaseBuilder(this, AppDatabase::class.java, "crimeBase.db").build()
}
}
最佳答案
打开你的拦截功能
fun getCrimes() = crimesDAO.getAllCrimes() as List<Crime>
变成悬浮的:
suspend fun getCrimes() = withContext(Dispatchers.IO) {
crimesDAO.getAllCrimes() as List<Crime>
}
为了调用可挂起的函数,您必须首先启动协程:
override fun onSomeEvent() {
(context as LifecycleOwner).lifecycleScope.launch {
val crimes = getCrimes()
// work with crimes
}
}
只要您的 context 不是遗留 Activity/fragment 类,它就可以工作。 AppCompatActivity 等现代类实现了 LifecycleOwner。
关于Android Room Kotlin - 后台线程查询 - 返回值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52746866/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub