2011-07-08 18 views
7

Tengo un problema extraño con el desarrollo en Scala en Android. Estoy usando el plugin android de sbt y ahora estoy intentando que los proveedores de contenido funcionen, pero ...Usar constantes de Java de Scala en Android

Necesito obtener una matriz de columnas, y lo hago exactamente como en el tutorial aquí: http://developer.android.com/guide/topics/providers/content-providers.html

Acaba de reemplazar el código de matriz de Java con Scala one. Se ve así:

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

Pero entonces, compilador Scala devuelve el error

[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 

Y en realidad es miembro de este objeto, y se define en android.provider.Contacts.PeopleColumns interfaz (que es implementado por People). También intenté obtenerlo directamente de PeopleColumns sin éxito (el mismo error). ¿Obtener constantes de Java en Scala es algo diferente o acabo de cometer un estúpido error en alguna parte?

ACTUALIZACIÓN:

Siguiente problema. Al usar ContactsContract, el error de los contactos se mantiene igual, y cuando intento otro método, no puedo acceder a ContactsContract.ContactsColumns directamente porque es una interfaz protegida.

[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

Por ahora, la mejor solución posible sería escribir todo el código de consulta como clase en java, y luego llamarlo. Implica mezclar idiomas, aumenta la complejidad y es algo que no me gusta, sin embargo. – exine

Respuesta

2

Este contexto está en desuso según la referencia. La nueva forma es ContactsContract, y deberías usar eso.

De todos modos, el problema es que esta constante es static definida en el interface PeopleColumns. La herencia de la estática es algo que Java tiene, pero Scala no, y está mal visto incluso en Java.

Intente importar PeopleColumns y usando PeopleColumns.NAME en su lugar, o mejor aún, use la nueva forma de hacer las cosas, sin dejar de hacerlo. Que no explico porque no tengo conocimiento del desarrollo de Android.

+0

'[error] /home/exine/proj/hello-world/src/main/scala/Activity.scala:13: NÚMERO valor no es un miembro del objeto android.provider.Contacts.PeopleColumns [error] PeopleColumns.NUMBER [error]^ [error] se ha encontrado un error' Lo intentaré con la nueva API. – exine

+0

Nueva API: mira la actualización anterior. ¿Alguna pista? – exine

+0

@eXine 'NUMBER' proviene de' PhonesColumns'. En cuanto a la actualización ... en ese punto, será mejor que escribas algo en Java para moverte. O la lógica de negocios cuando se trata de esas interfaces, o algún envoltorio de Java amigable con Scala a su alrededor. Ambas son malas opciones, pero parece que nos estamos quedando sin opciones buenas muy rápido. –

0

creo que tendrá que importar variables estáticas con android.provider.Contacts.PeopleColumns._ antes de que pueda acceder a ellos.

+0

Aún no se encuentra el valor. – exine

+0

usted tiene que llamar directamente como proyección val = Array ( NOMBRE, NÚMERO ) – logcat

Cuestiones relacionadas