2011-07-08 41 views
7

我在Android上的Scala中開發了一個奇怪的問題。我正在使用sbt android插件,現在我正在嘗試讓內容提供商工作,但是...在Android中使用Scala中的Java常量

我需要獲取數組列,並且完全按照教程在這裏:http://developer.android.com/guide/topics/providers/content-providers.html

剛剛用Scala替換了Java的數組代碼。它看起來像這樣:

val projection = Array(
    People.NAME, 
    People.NUMBER 
) 

不過,Scala編譯器將返回錯誤

[error] /home/exine/proj/hello-world/src/main/scala/Activity.scala:12: value NAME is not a member of object android.provider.Contacts.People 
[error]  People.NAME, 
[error]   ^
[error] one error found 

而實際上它是這個對象的成員,它的接口定義android.provider.Contacts.PeopleColumns(這是由People實現的)。我試着直接從PeopleColumns中獲取它,但沒有取得任何成功(同樣的錯誤)。從Scala的Java中獲取常量有點不同,或者我在某個地方犯了一個愚蠢的錯誤?

更新:

下一個問題。當使用ContactsContract.Contacts時,錯誤保持不變,當嘗試另一種方法時,我無法直接訪問ContactsContract.ContactsColumns,因爲它是受保護的接口。

[error] /home/exine/proj/hello-world/src/main/scala/Activity.scala:13: object ContactsColumns cannot be accessed in object android.provider.ContactsContract 
[error]  ContactsColumns.LOOKUP_KEY, 
[error] ^
[error] one error found 
+0

現在,最好的解決方案是將所有查詢的代碼寫入java中的類,然後調用它。它涉及語言混合,增加複雜性,但這是我不喜歡的東西。 – exine

回答

2

根據參考文獻不贊成此上下文。新方法是ContactsContract,你應該使用它。

無論如何,問題是這個常量是interface PeopleColumns上定義的static。靜態的繼承是Java所具有的,但Scala不具備,即使在Java中也是如此。

嘗試導入PeopleColumns並使用PeopleColumns.NAME取而代之 - 或者更好的方法是使用新的非棄用的方法。我沒有解釋,因爲我沒有Android開發知識。

+0

'[error] /home/exine/proj/hello-world/src/main/scala/Activity.scala:13:value NUMBER不是對象的成員android.provider.Contacts.PeopleColumns [error] PeopleColumns.NUMBER [error]^ [error]發現一個錯誤'我會嘗試使用新的API。 – exine

+0

新API - 查看上面的更新。任何線索? – exine

+0

@eXine'NUMBER'來自'PhonesColumns'。至於更新......在這一點上,你最好用Java寫一些東西來解決問題。無論是處理這些接口的業務邏輯,還是一些圍繞它們的Scala友好的Java包裝。兩者都是不好的選擇,但我們似乎很快就沒有好的選擇了。 –

0

我認爲你必須導入與android.provider.Contacts.PeopleColumns._靜態變量,然後才能訪問它們。

+0

找不到值。 – exine

+0

你必須直接調用它作爲val projection = Array( NAME, NUMBER ) – logcat