brenero
06/03/12, 10:44:47
Hola a todos:
Soy nuevo en esto de la programación en Android y me he embarcado en un pequeño proyecto pero me encuentro atascado en temas de acceso a BD, SQLite. ¿Alguno podría ayudarme?
El problema que tengo, al menos de momento.... (espero que no salgan muchos más, y si salen que no me traigan de cabeza como este), parece que esta en la creación de las tablas. El log me devuelve un error de No such table: "nombre de la tabla".
La creación de la tabla, así como su inicialización, se encuentran en una clase, por ejemplo uno de los métodos para la creación de tablas sería el siguiente:
private static final String DATABASE_CREATE_1 = "create table "
+ DATABASE_TABLE_1 + " (" + Jugadores_DORSAL
+ " integer primary key, " + Jugadores_NOMBRE + " text not null,"
+ Jugadores_PUESTO + " text not null," + Jugadores_ALTURA
+ " text not null," + Jugadores_FECHA_NACIMIENTO
+ " text not null," + Jugadores_PROCEDENCIA + " text not null"
+ ");";
Con sus variables inicializadas anteriormente del siguiente modo:
public static final String DATABASE_TABLE_1 = "Plantilla";
public static final String DATABASE_TABLE_3 = "Rivales";
public static final String Jugadores_PROCEDENCIA = "Procedencia";
Los datos integrados en la BD se encontrarían en el método onCreate del siguiente modo:
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_3);
db.execSQL("INSERT INTO Rivales VALUES ('Palestra')");
db.execSQL("INSERT INTO Rivales VALUES ('Rochelambert')");
Aparte también está implementado el método onUpgrade.
Una de las pantallas debe de mostrar un spinner en el que al seleccionar un equipo me muestre una información (también incluida en la BD). Para ello hago lo siguiente.
En el XML: <Spinner
android:id="@+id/spinner"
android:layout_marginTop="60dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/equipos_prompt"
/>
En una clase DataSource se encuentra la consulta a la BD con el siguiente método:
public Cursor getAllEquipos(){
return database.rawQuery("select rowid_id,* from "
+ EstaVoleyDataBase.DATABASE_TABLE_3,null);
}
En la clase Activity de dicha pantalla la tengo de dicha forma:
private Cursor equipos;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ultimos_resultados);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
PlantillaDataSource db = new PlantillaDataSource(
getApplicationContext());
db.open();
startManagingCursor(equipos);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.s imple_spinner_dropdown_item);
spinner.setAdapter(adapter);
try {
equipos = db.getAllEquipos();
int accountnameIndex = equipos
.getColumnIndexOrThrow(ACCOUNT_SERVICE);
if (equipos.moveToFirst()) {
do {
adapter.add(equipos.getString(accountnameIndex));
} while (equipos.moveToFirst());
}
}
finally {
db.close();
}
}
}
Cuando arranco el emulador y entro en la pantalla sale el error de: No such table: Rivales
Otra pantalla debe mostrarme un listado y en función del que pulses acceda a una pantalla u otra, que tengo implementada de dicha manera
XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="5dip" >
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/nombre_jugador"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
/>
<TextView
android:id="@+id/posicion_jugador"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="9.39"
android:ellipsize="marquee"
android:singleLine="true" />
</ListView>
</LinearLayout>
DataSource
public Cursor getAllJugadoresCursor() {
return database.rawQuery("select rowid _id,* from "
+ EstaVoleyDataBase.DATABASE_TABLE_1, null);
}
Y la clase Activity:
private Cursor jugadores;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PlantillaDataSource db = new PlantillaDataSource(
getApplicationContext());
db.open();
jugadores = db.getAllJugadoresCursor();
startManagingCursor(jugadores);
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.two_line_list_item, jugadores, new String[] {
"Dorsal", "Nombre" }, new int[] { android.R.id.text1,
android.R.id.text2 });
setListAdapter(adapter);
db.close();
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_plantilla,menu);
return true;
}
protected void onListItemClick(ListView parent, View v, int position,
long id) {
if(position == 0){
Intent jugador = new Intent(Plantilla.this,VictorDuque.class);
startActivity(jugador);
}
}
Por favor, ¿alguien me podría echar una mano? Estoy ya desesperado buscando una solución
Muchas Gracias
Soy nuevo en esto de la programación en Android y me he embarcado en un pequeño proyecto pero me encuentro atascado en temas de acceso a BD, SQLite. ¿Alguno podría ayudarme?
El problema que tengo, al menos de momento.... (espero que no salgan muchos más, y si salen que no me traigan de cabeza como este), parece que esta en la creación de las tablas. El log me devuelve un error de No such table: "nombre de la tabla".
La creación de la tabla, así como su inicialización, se encuentran en una clase, por ejemplo uno de los métodos para la creación de tablas sería el siguiente:
private static final String DATABASE_CREATE_1 = "create table "
+ DATABASE_TABLE_1 + " (" + Jugadores_DORSAL
+ " integer primary key, " + Jugadores_NOMBRE + " text not null,"
+ Jugadores_PUESTO + " text not null," + Jugadores_ALTURA
+ " text not null," + Jugadores_FECHA_NACIMIENTO
+ " text not null," + Jugadores_PROCEDENCIA + " text not null"
+ ");";
Con sus variables inicializadas anteriormente del siguiente modo:
public static final String DATABASE_TABLE_1 = "Plantilla";
public static final String DATABASE_TABLE_3 = "Rivales";
public static final String Jugadores_PROCEDENCIA = "Procedencia";
Los datos integrados en la BD se encontrarían en el método onCreate del siguiente modo:
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_3);
db.execSQL("INSERT INTO Rivales VALUES ('Palestra')");
db.execSQL("INSERT INTO Rivales VALUES ('Rochelambert')");
Aparte también está implementado el método onUpgrade.
Una de las pantallas debe de mostrar un spinner en el que al seleccionar un equipo me muestre una información (también incluida en la BD). Para ello hago lo siguiente.
En el XML: <Spinner
android:id="@+id/spinner"
android:layout_marginTop="60dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/equipos_prompt"
/>
En una clase DataSource se encuentra la consulta a la BD con el siguiente método:
public Cursor getAllEquipos(){
return database.rawQuery("select rowid_id,* from "
+ EstaVoleyDataBase.DATABASE_TABLE_3,null);
}
En la clase Activity de dicha pantalla la tengo de dicha forma:
private Cursor equipos;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ultimos_resultados);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
PlantillaDataSource db = new PlantillaDataSource(
getApplicationContext());
db.open();
startManagingCursor(equipos);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.s imple_spinner_dropdown_item);
spinner.setAdapter(adapter);
try {
equipos = db.getAllEquipos();
int accountnameIndex = equipos
.getColumnIndexOrThrow(ACCOUNT_SERVICE);
if (equipos.moveToFirst()) {
do {
adapter.add(equipos.getString(accountnameIndex));
} while (equipos.moveToFirst());
}
}
finally {
db.close();
}
}
}
Cuando arranco el emulador y entro en la pantalla sale el error de: No such table: Rivales
Otra pantalla debe mostrarme un listado y en función del que pulses acceda a una pantalla u otra, que tengo implementada de dicha manera
XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="5dip" >
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/nombre_jugador"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
/>
<TextView
android:id="@+id/posicion_jugador"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="9.39"
android:ellipsize="marquee"
android:singleLine="true" />
</ListView>
</LinearLayout>
DataSource
public Cursor getAllJugadoresCursor() {
return database.rawQuery("select rowid _id,* from "
+ EstaVoleyDataBase.DATABASE_TABLE_1, null);
}
Y la clase Activity:
private Cursor jugadores;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PlantillaDataSource db = new PlantillaDataSource(
getApplicationContext());
db.open();
jugadores = db.getAllJugadoresCursor();
startManagingCursor(jugadores);
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.two_line_list_item, jugadores, new String[] {
"Dorsal", "Nombre" }, new int[] { android.R.id.text1,
android.R.id.text2 });
setListAdapter(adapter);
db.close();
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_plantilla,menu);
return true;
}
protected void onListItemClick(ListView parent, View v, int position,
long id) {
if(position == 0){
Intent jugador = new Intent(Plantilla.this,VictorDuque.class);
startActivity(jugador);
}
}
Por favor, ¿alguien me podría echar una mano? Estoy ya desesperado buscando una solución
Muchas Gracias