Desarrollo de Android 101 – Parte 3: Introducción a las bases de datos

Eva Jiménez
Eva Jiménez

En este tutorial, pasaremos de nuestro último tutorial sobre elementos gráficos para empezar a centrarnos en las bases de datos en el desarrollo de Android. La plataforma de Android utiliza bases de datos SQLite en sus aplicaciones y es una de las cinco opciones para almacenar datos en el desarrollo de Android. Solo nos centraremos en el desarrollo de SQLite en Android porque es clave para la construcción de un programa viable / funcional. Después de este tutorial, debería poder implementar una base de datos SQLite, que luego puede insertar y seleccionar elementos de matrices en la base de datos.

Para este proyecto, crearemos un generador de citas aleatorias que le pedirá que ingrese citas o dichos en un cuadro de texto y presione un botón para insertarlos en la base de datos. Publicaremos una tostadora de confirmación que nos permitirá ver si los datos se han ingresado en la base de datos con éxito y el cuadro de texto estará vacío. Si se presiona un segundo botón, se accederá a la base de datos y se le indicará que seleccione una cita aleatoria de la base de datos para mostrarla en un brindis en la pantalla.

Para empezar haremos un nuevo proyecto llamado Cuotas aleatorias. En parte, una de las series por las que pasamos al realizar un nuevo proyecto, por lo que no volveremos a seguir todos los pasos, sino que solo te daré la información que necesitas. La información para iniciar este proyecto es la siguiente:

  • Nombre del proyecto: Cuotas aleatorias
  • Objetivo de construcción: Android 1.5
  • Nombre de la aplicación: Cuotas aleatorias
  • Nombre del paquete: com.gregjacobs.randomquotes
  • Crea una acción: Cotizaciones Principal
  • Versión mínima del SDK: 3
  • Después de ingresar estos valores y presionar Finalizar, comenzaremos a crear un archivo de clase en el nuestro. com.gregjacobs.randomquotes paquete. Para hacer esto, haremos clic derecho sobre el paquete y navegaremos hasta Nuevo luego a Clase. Cuando aparezca la nueva ventana, los únicos datos que ingresaremos serán los Nombre sección llenándola con DBAdapter. Después de esto presionamos Terminar y se presentan con un archivo de clase de hueso desnudo que rápidamente comenzaremos a modificar. Este tutorial será como el último en el sentido de que se publicará el código y explicaré las partes importantes y las funciones que realiza. La única diferencia con el código del tutorial anterior será que incluyo archivos de texto y también documenté el código aquí para que pueda descargarlo y compararlo. Empezaremos con el DBAdapter.java expediente:

package com.gregjacobs.randomquotes;

import java.util.Random;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

Comenzaremos importando todas las herramientas necesarias para ejecutar esta base de datos SQLite. Todo esto puede resultar sencillo para los desarrolladores de bases de datos, pero lo discutiremos de todos modos. ContentValues nos permiten la capacidad de almacenar un conjunto de valores para declaraciones de entrada, Contexto como se explica en el último post nos permite acceder al entorno de la aplicación. Cursor es probablemente la importación más esencial que necesitaremos junto a las importaciones de SQLite. Cursor nos permite acceder a los datos devueltos al cursor de consulta de la base de datos. SQLException nos permite lanzar excepciones SQL si alguna vez hay un error, estos mensajes dan una mayor comprensión de cuál puede ser el problema. SQLiteDatabase nos da la capacidad de administrar la base de datos SQLite por métodos. SQLiteOpenHelper es básicamente una clase auxiliar que le permite crear y versionar la gestión de la base de datos. Iniciar sesión básicamente registrar la salida en caso de error.

public class DBAdapter
{
    int id = 0;
    public static final String KEY_ROWID = "_id";
    public static final String KEY_QUOTE = "Quote";
    private static final String TAG = "DBAdapter";

    private static final String DATABASE_NAME = "Random";
    private static final String DATABASE_TABLE = "tblRandomQuotes";
    private static final int DATABASE_VERSION = 1;

    private static final String DATABASE_CREATE =
        "create table tblRandomQuotes (_id integer primary key autoincrement, "
        + "Quote text not null );";

    private final Context context;

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

Aquí definimos todas nuestras variables para ser utilizadas en la base de datos desde el nombre de la base de datos hasta la declaración para crear una base de datos. Usamos variables finales porque nunca cambiarán los valores y crearán una variable para los nombres de las matrices y, de manera similar, harán nuestras vidas más fáciles de lo que es difícil codificar todos nuestros valores y hacer demasiado (recuerde la reutilización).

    public DBAdapter(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

	private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context)
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion,
                              int newVersion)
        {
            Log.w(TAG, "Upgrading database from version " + oldVersion
                  + " to "
                  + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS tblRandomQuotes");
            onCreate(db);
        }
    }
    

Arriba definimos un constructor para tomar el contexto de la aplicación y extenderlo al nuestro. DatabaseHelper justo debajo del constructor. La DatabaseHelper la clase extiende la nuestra SQLiteOpenHelper lo que agregará una función mayor a la gestión de nuestra base de datos SQLite. La función clave que veremos utilizada más adelante será onKrei lo que nos permitirá ejecutar una sentencia SQL para crear nuestra base de datos.

    //---opens the database---
    public DBAdapter open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    //---closes the database---
    public void close()
    {
        DBHelper.close();
    }
    

Arriba tenemos dos funciones clave que nos permiten abrir y cerrar la base de datos a la que es posible hacer referencia cuando las llamamos en nuestra .Java expediente.

    //---insert a title into the database---
    public long insertQuote(String Quote)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_QUOTE, Quote);
        return db.insert(DATABASE_TABLE, null, initialValues);
    }

La función anterior procesará nuestras cotizaciones cuando las llamemos principalmente .Java expediente. También los preparará para ingresar a la base de datos colocando la cadena Cita en un ContentValues llamada valores iniciales que luego se ingresa en la tabla de la base de datos.

    public int getAllEntries()
    {
        Cursor cursor = db.rawQuery(
                    "SELECT COUNT(Quote) FROM tblRandomQuotes", null);
                if(cursor.moveToFirst()) {
                    return cursor.getInt(0);
                }
                return cursor.getInt(0);

    }
    

Esta función consultará en la tabla de la base de datos el número de citas ingresadas para que pueda ayudar al generador de números aleatorios en cualquier número alto a elegir para que no arrojemos una excepción. Usamos un Pregunta cruda principalmente porque personalmente no estoy muy interesado en la forma en que Android maneja sus consultas (tener que insertar varias partes de la declaración en segmentos y separarlas con comas), pero estoy impresionado de que le permitan tener una funcionalidad completa con SQL nativo. pregunta. La instrucción if moverá el cursor al primer resultado (si hay muchos resultados) y tomará el primer número entero que vea allí. Si la declaración if no es verdadera, capturará el resultado de la posición inicial de todos modos.

    public String getRandomEntry()
    {

    	id = getAllEntries();
    	Random random = new Random();
    	int rand = random.nextInt(getAllEntries());
    	if(rand == 0)
    		++rand;
        Cursor cursor = db.rawQuery(
                    "SELECT Quote FROM tblRandomQuotes WHERE _id = " + rand, null);
                if(cursor.moveToFirst()) {
                    return cursor.getString(0);
                }
                return cursor.getString(0);

    }

}

Esta función se llamará la principal .Java El programa devuelve un resultado aleatorio basado en el número de entradas en nuestra base de datos. Usamos la función getAllEntries para obtener el número de comillas y luego le decimos a nuestra variable aleatoria que no se puede exceder identificador. En nuestra declaración elegida, le decimos que busque una cotización. DONDE _id = rand que es nuestro número aleatorio.

Una vez que este archivo de clase está terminado, tenemos un adaptador de base de datos completamente reutilizable que está listo para comenzar a insertar citas en la base de datos. Ahora debemos centrarnos en ambos archivos XML, lo que será un viaje rápido por la memoria, por lo que el código y las imágenes se publicarán y no deberíamos estar revisando, porque todo es básicamente de la última publicación. Aquí lo tienes main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/Quote"
/>
<EditText
android:id="@+id/Quote"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/go"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/press"
/>
<Button
android:id="@+id/genRan"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/genRan"
/>
</LinearLayout>

Aquí lo tienes strings.xml expediente:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="Quote">Please Enter A Quote:</string>
    <string name="app_name">Random Quotes</string>
    <string name="press">Press Me!</string>
    <string name="genRan">Generate Random Quote!</string>
</resources>

Ambos son bastante simples y la única diferencia entre estos archivos y las publicaciones anteriores es el nodo de cadena adicional en strings.xml y el botón extra en main.xml. Ahora tenemos el diseño en su lugar con todo lo que queremos que sea ahora nuestro trabajo para codificar el CotizacionesMain.java expediente. Este archivo registrará nuestros dos botones y los adjuntará a un controlador de eventos con una declaración de cambio. Aquí está el código para el nuestro CotizacionesMain.java expediente:

package com.gregjacobs.randomquotes;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

Aquí importamos todos los elementos necesarios para poder llevar a cabo este proyecto. Todos estos deben serle familiares por Graphic Elements y, si no lo son, es una buena publicación para comenzar y trabajar aquí.

public class QuotesMain extends Activity {
	DBAdapter db = new DBAdapter(this);
	EditText Quote;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Capture our button from layout
        Button setButton = (Button)findViewById(R.id.go);
        Button getButton = (Button)findViewById(R.id.genRan);
        // Register the onClick listener with the implementation above
        setButton.setOnClickListener(mAddListener);
        getButton.setOnClickListener(mAddListener);
    }

Ahora necesitamos botones referenciados por ID y son getButton (que recibe la información del cuadro de texto y la ingresa en la base de datos) y botón de ajuste (que toma una cotización aleatoria de la base de datos dependiendo del número de elementos en la base de datos). Ambos tienen el mismo diseño de eventos y las decisiones sobre qué código lanzar se toman a continuación.

    // Create an anonymous implementation of OnClickListener
    private OnClickListener mAddListener = new OnClickListener()
    {
    	public void onClick(View v)
    	{
    		switch(v.getId())
    		{
    		case R.id.go:
				db.open();
				long id = 0;
				// do something when the button is clicked
				try
				{
					Quote = (EditText)findViewById(R.id.Quote);
					db.insertQuote(Quote.getText().toString());

					id = db.getAllEntries();

					Context context = getApplicationContext();
					CharSequence text = "The quote '" + Quote.getText() + "' was added successfully!nQuotes Total = " + id;
					int duration = Toast.LENGTH_LONG;

					Toast toast = Toast.makeText(context, text, duration);
					toast.show();
					Quote.setText("");
				}
				catch (Exception ex)
				{
					Context context = getApplicationContext();
					CharSequence text = ex.toString() + "ID = " + id;
					int duration = Toast.LENGTH_LONG;

					Toast toast = Toast.makeText(context, text, duration);
					toast.show();
				}
				db.close();
				break;

En la declaración de caso anterior, podemos ver que capturamos el texto del cuadro de texto e ingresamos los datos en la base de datos mediante db.insertQuote el la DBAdapter clase java. Después de una inserción exitosa, mostraremos un brindis que nos permite ver qué cita se insertó correctamente y cuál es el número de citas en la base de datos.

    		case R.id.genRan:
    			db.open();
    			//long id1 = 0;
    			// do something when the button is clicked
    			try
    			{
    				String quote = "";
    				quote = db.getRandomEntry();
    				Context context = getApplicationContext();
    				CharSequence text = quote;
    				int duration = Toast.LENGTH_LONG;

    				Toast toast = Toast.makeText(context, text, duration);
    				toast.show();
    			}
    			catch (Exception ex)
    			{
    				Context context = getApplicationContext();
    				CharSequence text = ex.toString();
    				int duration = Toast.LENGTH_LONG;

    				Toast toast = Toast.makeText(context, text, duration);
    				toast.show();
    			}
    			db.close();
    		}
		}
    };
}

Este caso usa una variable de cadena para referirse a la entrada aleatoria que extraemos de la base de datos usando db.getRandomEntry. Luego mostramos esos datos en un brindis para mostrar que la información fue realmente capturada. Todo este código, cuando se compila y se muestra en una pantalla de Android, debería verse así:

Texto entrante:

Visualización de entradas aleatorias:

Con una introducción a las bases de datos para Android cubierta, puede comenzar a escribir programas que necesitan almacenamiento de datos, como el producto final mencionado en la primera publicación. Hay muchas otras características que cubrir en la base de datos SQLite para Android. Más de estos se tratarán en el próximo tutorial. Cosas como actualizar su base de datos, eliminar entradas y familiarizarse con el DDMS (Servicio de monitor de depuración de Dalvik) son parte esencial de la programación de Android. Si no puede esperar hasta el próximo artículo, consulte estos artículos sobre DDMS y Actualizar y quitar. Como siempre, si alguien tiene algún problema, pregunta o inquietud, no dude en preguntar y haré todo lo posible para responderle antes de la próxima publicación. Hasta la próxima, Happy Hacking!

Archivos de código de texto para comparación:

DBAdapter | cuerdas | principal | Cotizaciones Principal

Artículos utilizados como referencia:

DevX: crear y utilizar bases de datos en Android
Desarrolladores de Android: Guía de referencia

Continúe con la Parte 4: Código avanzado de base de datos / GUI y DDMS

43.002684-81.21499

  • Jeff dice:

    Me encantaría seguir estas publicaciones, pero no tengo un dispositivo Android y siempre he escuchado cosas malas sobre los emuladores.

    ¿Confirmar / rechazar? ¿Cuál es un buen dispositivo económico para operar?

    He estado esperando demasiado por el Strip …

  • Greg R. Jacobs dice:

    @Jeff – El emulador de mi computadora funciona bien. Además, te da la oportunidad de probar el sistema Android de Google. Si sigue los tutoriales y en lugar de hacer el emulador 1.5, cámbielo a 2.1 y debería ver la mayoría de las funciones nuevas. En cuanto a los dispositivos, estoy en Canadá y he usado HTC Magic, pero HTC Dream puede hacerlo si solo desea desarrollar aplicaciones.

  • Robar dice:

    en TSQL, la forma de obtener una secuencia aleatoria es
    SELECCIONE 1 NewGuid (), myfield … FROM TABLE ORDER FROM 1

    no estoy seguro si sql express admite esto

  • fotoflojoe dice:

    @Jeff

    Sí, lo que dijo Greg. Al configurar su entorno eclipse / Android, si hay problemas con el emulador, es necesario procesarlos y ejecutar el emulador correctamente.

    MIHO, el emulador es mucho más efectivo que el ciclo de desarrollo de Android, mientras que constantemente empujar la última versión de su aplicación a un dispositivo físico realmente se está volviendo viejo, muy rápido.

  • fm dice:

    Seguro que el emulador es más lento que un dispositivo real, pero funciona perfectamente bien para probar cualquier programa. excepto quizás juegos.

    En cuanto a un dispositivo Android barato, algunos iDevices pueden tener jailbreak y androides de dos arranques: http://www.ipodtouchfans.com/forums/showthread.php?t=295287
    O puede probar ebay para G1.

  • Jeff dice:

    @Greg y fotoflojoe
    ¡Dulce! Tal vez salga de mi culo y realmente juegue con el emulador. Como dije, solo he escuchado cosas malas … aún no tengo experiencia personal …

  • jeditaliano dice:

    Maldita sea, necesito prestar atención a estos. aquí es donde comencé a perderme en la clase de Java.
    y def. prueba un emulador. puede restablecer el emulador si ha alcanzado el “punto de retorno”, pero hacer lo mismo con un dispositivo físico puede ser mucho más frustrante. No probé ningún emulador de Android, pero después de comenzar a leer estas guías y probarlas, prefiero probarlas en un emulador hasta que sean perfectas, luego el mundo real las probará por teléfono.

  • cantido dice:

    @jeditaliano

    No puede hacer que el dispositivo se comporte mal con mucha facilidad. Si su código es incorrecto, Android eliminará la aplicación.

    @fotoflojoe

    Hablando de experiencia aquí; No he encontrado cargar un programa en mi software frente a cargar un programa en AVD de manera tan diferente. No es inmediato ni dura tanto. No le gusta que el AVD tenga funciones mágicas para acelerarlo, esa es la capacidad de reemplazar partes del programa de inmediato.
    La verdadera ventaja del emulador en mi humilde opinión es que puede probar varias configuraciones de dispositivo sin tener realmente esos dispositivos.

    @ Todo

    Puede obtener teléfonos Android con menos de £ 100 ahora. Estos no tienen grandes pantallas o algunas de las cosas elegantes del coprocesador, pero son muy buenos solo para demostrar que su programa funciona en el hardware real. El emulador es muy pobre en lo que respecta a la animación de imágenes, etc. y, en general, es “más lento”, por lo que es menos probable que llegue a condiciones de carrera, etc.

  • Erwin dice:

    Fck java y android solo obtienen N900. Este teléfono y maemo fueron creados para los verdaderos fanáticos de Linux y puedes escribir programas superrápidos en C / C ++ como antes. La compilación de compilación tampoco es hora de configurar porque hay una imagen completa de vmware en el sitio web de maemos.

    Dudo que CUALQUIER teléfono basado en Android supere al N900 multifuncionalmente y oh sí, ¿por qué ejecutarías un Android de código parcialmente cerrado con tu n900 … Sin mencionar los aburridos iphones basados ​​en MacOS, Nokia se encargará de todos?

  • Dylan dice:

    Es bueno ver que va más allá de lo básico, puedo comenzar a configurar ahora.

    Buen tutorial, ¡y por favor sigue haciéndolo!

  • cantido dice:

    @Fck java

    Demasiado justo, los dispositivos Android no funcionan con “java”. Usan el compilador de Java, pero el código de bytes que genera no funciona realmente en un teléfono.

    > y Android acaba de obtener N900.

    Android == Muchos dispositivos.
    N900 == dispositivo único.

    > Este teléfono y maemo fueron creados
    > para los verdaderos fanáticos de Linux

    ¿Qué es un “verdadero fan de Linux”? ¿Está apuntando a personas que solo ejecutarán GNU / Linux a pesar de que glibc no es adecuado para teléfonos integrados / móviles?

    > y puedes escribir programas superrápidos en C / C ++

    Android tiene NDK y las versiones recientes permiten el código nativo (el código nativo no tiene que estar escrito en C solo para que usted lo sepa) para hacer muchas cosas que se entregaron a Dalvik a través de JNI.

    > env de compilación cruzada porque es
    > tampoco tengo tiempo para configurar

    El NDK de Android es un único archivo descargable.

    > N900 en multitarea

    ¿Lo es? Android usa el mismo código a este respecto.
    En todo caso, los reemplazos más ligeros de Android para los componentes “estándar” de Linux lo ayudarían en esta área.

    > y oh sí, ¿por qué correrías?
    > Android de código parcialmente cerrado en su n900 …

    ¿Qué piezas están cerradas? El mercado, etc. requiere acuerdos con Google y la fuente para las nuevas versiones se conserva hasta que esté lista, pero puede descargar y crear un entorno Android completo … y puede obtener la fuente para todo. Ah, y no tiene que vincularlo a las bibliotecas GPL …

  • Andy dice:

    Parece que el campo _id en la base de datos comienza con 1 y no con cero, por lo que el código en DBAdapter.getRandomEntry () nunca devuelve el último elemento de la matriz. Parece que el desarrollador vio esto un poco con este código:

    if (rand == 0) ++ rand;

    Haga esto un paso más allá y elimine la condición if: siempre agregue 1 a rand antes de realizar la consulta y el código devolverá cada una de las filas en la base de datos si presiona el botón GenerateRandomQuote con suficiente frecuencia.

    Otra cosa en el mismo método – el método getAllEntries () se llama dos veces sin motivo aparente – una vez para establecer el valor de un identificador y una vez para cambiar al método random.nextInt (). Modifique la llamada random.nextInt () a:

    int rand = random.nextInt (id);

    El código funcionará como está escrito, pero funcionará mejor con este cambio (dos accesos a la base de datos por llamada en lugar de tres). Otra opción sería simplemente eliminar la variable id por completo.

    Otra declaración: el método getAllEntries () realmente no obtiene todas las entradas, obtiene un recuento de las entradas. Debe tener un nombre apropiado en función de lo que hace, por ejemplo, getEntriesCount ().

  • Tomas dice:

    No diría que enviarlo al dispositivo varias veces fuera más difícil que enviarlo al emulador.

    Proceso para rodar en un emulador:
    Ejecuta un emulador
    Empuje una nueva compilación con adb install -r appname.apk

    Proceso para rodar en un dispositivo:
    Conectar un dispositivo
    Empuje una nueva compilación con adb install -r appname.apk

  • Cameron dice:

    Mi conocimiento actual me lleva a creer que hay un error en su programa. Según tengo entendido, Random.nextInt (int param) es inclusivo con respecto al 0, pero exclusivo con respecto al parámetro entero. Y debido a que desea generar un número entre 1 y param, querrá tener rand ++ independientemente de si el valor es igual a 0 o no; de lo contrario, la cita con el _id más alto nunca aparecerá.

    Ahora estoy reescribiendo la aplicación según sus especificaciones mientras hablamos, así que no sé si podría estar malinterpretando algo o no, hágamelo saber.

  • QWERTY dice:

    ¿Cuál es el mejor libro de Java / Android que recomendaría a alguien que siempre se ha negado a tocar Java incluso con una barra de 10 metros y todavía no tiene la intención de usarlo fuera del mundo de Android?

  • rube203 dice:

    Parece que me falta algo. Está configurando DBAdapter db = new DBAdapter (esto); sin embargo, su único constructor en DBAdapter es DBAdapter (Context). Como resultado, tuve que mover la instancia a la función onCreate, donde pude proporcionarle ApplicationContext.

    De lo contrario, excelentes tutoriales, algunos de los mejores que he visto. Sigan con el buen trabajo, buscaré futuros.

  • 11011san dice:

    Odio ser una buena elección, pero existe un problema de minería de grietas sobre cómo operar este código. Nunca mostrará la última cita dada, lo que significa que el aleatorio es exclusivo, pero esto solo se puede solucionar eliminando la siguiente declaración si, por lo que siempre aumenta el número entero de borde moviendo el [0,1-id] Alabama [1,id] el deseo es el intervalo deseado.

  • Sunil Kamat dice:

    Hola Greg,
    Me sale un error. Dice que no hay tal tabla tblRandomQuotes. No es capaz de crear una tabla. Cual puede ser el error? Verifiqué dos veces y comparé el código con lo que proporcionó, y parece ser el mismo. Subí la captura de pantalla incorrecta aquí: http://jump.fm/TUHKH

    Gracias.

  • Sunil Kamat dice:

    El enlace de la captura de pantalla en mi comentario anterior tiene algún problema. Compruébalo aquí: http://tinypic.com/r/9jnhxs/3

  • 11011san dice:

    @Sunil Kamat
    No puedo ser un país, pero creo que tu pregunta es incorrecta (“SELECT Quote FROM tblRandomQuotes WHERE _id =” + rand) pero lo que parece estar contigo es (“SELECT SELECT Cote FROM tblRandomQuotes =” + rand). es posible que también desee verificar que su borde esté dentro del rango. El _id no tiene que ser 0. Este es mi mejor geos de lo que mostró. Espero que esto ayude.

  • Sunil Kamat dice:

    @san

    Gracias por su respuesta.

    Pero el problema es ingresar los datos. Dice “no existe tal tabla: tblRandomQuotes” (enlace de captura de pantalla abv).

    Vaya a esta línea:
    Cursor cursor = db.rawQuery (“SELECCIONAR CUENTA (Cotización) DE tblRandomQuotes”, nulo);
    y luego lanza la excepción que dice que no hay tal tabla. Pero no dio ningún error durante la creación de la tabla.

    Siento que no crea la tabla en sí. El SQL para la creación de matrices es el mismo que se da en el artículo.

    ¿Funciona al final? ¿Hizo algún cambio diferente al código que se proporciona en el artículo?

  • Sunil Kamat dice:

    HUESO. Encontré el problema. Al crear la tabla inicialmente, cometí un error tipográfico. Lo cambié más tarde después de una ejecución. Pero no toma una tabla con el nuevo nombre de la tabla y da los errores mencionados anteriormente.

    Nombre anterior: tblRandomuotes
    Nuevo nombre: tblRandomQuotes

    ¿Debo hacer una pregunta sobre cómo eliminar una tabla para eliminar la tabla escribiendo? ¿Hay otra forma de vaciar las matrices creadas temporalmente?

  • cantido dice:

    @QWERTY

    Java es bueno. El lenguaje siempre ha sido sólido y la biblioteca estándar es extensa y (generalmente) bien pensada. Y obtienes la ventaja adicional de que es un entorno maduro sin que todas las chicas al estilo Ruby twitteen tonterías.

    De todos modos, realmente no necesitas un libro. Eche un vistazo a los ejemplos de Android y comenzará a aprenderlo. Realmente no necesita aprender Java a través de ningún libro de Java que pueda discutir sobre las bibliotecas estándar, etc., de las cuales usará solo una fracción. La Guía de bolsillo de Java de O’Reilly es buena para esos momentos en los que “olvidé por completo cómo funciona” en los que necesita actualizar algunos detalles de sintaxis, etc.

    Aceptar el hecho de que realmente no tienes un circuito principal y tienes que conducir todo a través de “eventos” es el mayor desafío en mi humilde opinión.

  • Sunil Kamat dice:

    HUESO. Esto es lo que hice para resolver mi problema, pero esta no es la solución correcta. Solo trabaja para completar el programa.

    Esto es lo que sucedió:
    Cometí un error tipográfico en el nombre de la tabla en la cuestión de crear una matriz e hice la primera ejecución que creó la base de datos y la matriz (con error tipográfico) según sea necesario, pero la cuestión de “elegir un cálculo (Cotización) …” tenía el nombre de tabla correcto como se indica en el tutorial. Entonces me dio como un error decir que no se encontró una mesa. Corregí el nombre de la tabla en la consulta creativa y lancé el programa nuevamente, pero el error sigue siendo el mismo en la pregunta “elegir número (Cita) …”.

    Solución:
    Para que funcione, simplemente cambié DATABASE_NAME a “RandomQ” en lugar de “Random” y ejecuté el programa nuevamente con el nombre de la matriz corregido en la solicitud de creación. Ahora estaba relacionado con la nueva base de datos y todo funcionó bien.

    De lo único que no estoy seguro es de cómo eliminar la matriz creada en la base de datos “Aleatoria”. Porque después de una ejecución, siempre se hacía referencia al nombre de la tabla anterior, incluso si el nombre se cambió más adelante en la solicitud de creación.

    Básicamente, debería crear otra matriz en la misma base de datos y las consultas deberían estar referenciadas a esa matriz, pero siempre decía que no se encontró una matriz.

    Bueno, la solución fue solo una solución para ejecutar este programa.

    Espero que la parte de eliminación de la tabla se cubra en el próximo tutorial.

  • Sackey dice:

    No sé cómo eliminar solo la tableta, pero puedes restablecer tu dispositivo virtual desde “Android SDK and AVD Manager”

    ADVERTENCIA: borra todos los datos del usuario y lanza el dispositivo como si fuera una nueva instalación, por lo que durará tanto como la primera vez que lo iniciaste.

    Puede acceder al administrador con un botón de eclipse, seleccionar dispositivos virtuales, seleccionar el que está utilizando y hacer clic en el botón que dice “Iniciar …”

    En la ventana que aparece, marque la casilla de verificación “Eliminar datos de usuario”.

    Ahora, si cambia el nombre de RandomQ a Random, debería funcionar.

  • 11011san dice:

    @Sunil Kamat
    en el método onUpgrade () tiene el comando para eliminar la base de datos, ya sea que haya intentado ejecutarlo en el constructor para una compilación o simplemente el comando de caída. Otra forma en que creo que funcionará es cambiando DATABASE_VERSION a 2 y ejecutará los comandos en el primer inicio. Siempre eligió un dolor mack que la tabla de errores ortográficos y la tabla de ortografía correcta están allí, por lo que todo se eliminará.

    Ah, y el número es una parte importante de mi nombre, es un valor ASCII binario y san lick Mr en japonés. Simplemente juega un poco con las cosas, pero no te preocupes.

  • cantido dice:

    @ 11011san

    La palabra que busca es “honorable”.
    No usas los honores para informarte a ti mismo.

  • Sunil Kamat dice:

    @Sakey @ 11011san
    ¡Gracias por su respuesta chicos!
    Bueno, el cambio de DATABASE_VERSION funcionó muy bien. Restaurar los teléfonos virtuales también eliminará mis otros programas que tengo. Así que supongo que el cambio de versión es la mejor y más ordenada opción, al menos según mi escenario.

  • 2005732 dice:

    Por cierto, obtiene un error “tabla no encontrada” si también lo escribe accidentalmente tblRandomQtoes. ESE error me costó una buena media hora ….;)

  • Paresh N. Mayani dice:

    Hola,
    Según escuché, si se conecta un emulador, se crea una base de datos en el directorio / datos / datos / nombre del paquete / bases de datos.

    Pero tengo una pregunta que es “Cuando pruebo esta aplicación de base de datos de cotizaciones en una base de datos de Android real, ¿dónde se crea la base de datos?”

    por favor explica mi confusión

  • atomjack dice:

    ¡Gran tutorial! Si puedo hacer una sugerencia, puede eliminar el método getAllEntries () en DBAdapter y dejar que el motor sqlite se encargue de elegir una cotización aleatoria para usted, como esta:

    public string getRandomEntry () {
    Cursor cursor = db.rawQuery (“SELECT” + KEY_QUOTE + “FROM” + DATABASE_TABLE + “ORDER BY HANDOM () LIMIT 1”, null);
    cursor.moveToFirst ();
    return cursor.getString (0);
    }

  • SQRL dice:

    Bueno, en primer lugar GRACIAS por hacer que estos tutoriales estén disponibles. Son extremadamente valiosos para los gatitos escépticos como yo. Habiendo dicho eso, miré el código un millón de veces y, aunque parece que seguí tu ejemplo al pie de la letra, y aunque Eclipse no muestra ni una x roja ni se agita cuando se carga en mi emulador o droide, obtengo el mismo resultado. . Todo se ve como debería, escribo una cotización, presiono el botón para guardar y recibo un mensaje que dice que el programa se ha detenido inesperadamente, intente nuevamente más tarde y me veo obligado a cerrar. ¿Alguna idea de por qué esto podría ser?

  • Noob13 dice:

    ¿Hay alguna forma de crear previamente la base de datos y ponerla en actividades como copiarla por teléfono durante la instalación?

  • Greg R. Jacobs dice:

    @ Noob13 – ¡Buena pregunta! Me pondré en contacto con usted, pero ahora puede hacer que conecte su dispositivo a su computadora y, si se reconoce como un DDMS, podría enviar la base de datos al dispositivo actual. (Un buen ejemplo es la parte IV de este tutorial y usaría el ícono al lado del mencionado para enviarlo a un dispositivo)

  • toby dice:

    Hola, gracias por los fantásticos tutoriales.

    solo una observación:

    ¿No deberíamos usar las variables finales estáticas como DATABASE_TABLE en lugar de tblRandomQuotes?

    En este caso, la reutilización / cambio de nombre será más fácil (solo ocúpese de las variables de cadena) e incluso evitará que escriba …

  • Greg R. Jacobs dice:

    @Toby – Sí, esa es la forma correcta de programar la clase para que sea completamente reutilizable. Esto se hizo con un estilo rápido y sucio para mostrar las capacidades de Android y lo fácil que es programar en el idioma. Recomiendo encarecidamente a las personas que tengan sugerencias que reprogramen todo lo publicado aquí para mejorarlo y acelerarlo. Este tutorial solo rasca la superficie de lo que puede hacer Android. Debo admitir que, cuando programé esa clase, volví a la mentalidad SQL y habría tenido que usar variables en lugar de nombres de matrices, y así sucesivamente. Perdón por la confusión y dejo mi llave, tienes toda la razón 🙂

  • Fred dice:

    ¿No es posible obtener una versión PDF de toda la instrucción con el formato de texto correcto? Aquí con WP duele mucho leer y usar.

    Gracias por adelantado

    Fred

  • Rodney dice:

    Amo este tipo de ejemplos, gracias. Intenté crear un programa y trabajar con una base de datos. Quiero ver la base de datos directamente. ¿Cómo puedes hacer eso en el emulador?

  • AndroidRetard dice:

    No sé si estoy haciendo algo completamente estúpido. Creo que seguí el ejemplo correctamente, pero obtengo un error bastante fundamental cuando intento compilar

    public DBAdapter open () lanza SQLException {

    lo entiendo


    Falta de coincidencia de tipos: no se puede convertir de DBAdapter.DatabaseHelper a DBAdapter

    tratando de devolver “esto”.

    Tuve que cambiar


    Private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    Alabama


    DatabaseHelper estático privado DBHelper;
    SQLiteDatabase db estático privado;

    pero no crees que esa es la causa?

  • AndroidRetard dice:

    Doh!

    Hubo un problema de corchetes, estaba confundido porque utilizo la notación de corchetes estándar y no cerré mi tarea DatabaseHelper correctamente.

  • lavino dice:

    ¿Dónde puedo configurar una máscara de emulador de aspecto tan hermoso? Mi competidor es tan simple con nada más que una caja negra para la pantalla y el teclado, etc., tiene razón …

  • lavino dice:

    ¿Alguien sabe cómo cambiar el nombre de una clase y el archivo java después de crearlo? Estúpidamente llamé Adapter to Adpater cuando creé la clase … Primero pensé que estaba haciendo algo mal … LOL. ¿O no hay otra forma que eliminar la clase y rehacer todo desde cero?

  • Hamz dice:

    ¡Grandes tutoriales! Simplemente haga que su código sea más dulce:
    Al generar cotizaciones aleatorias, puede guardar algunas líneas escribiendo
    int rand = random.nextInt (getAllEntries ()) + 1;

    En lugar de
    int rand = random.nextInt (getAllEntries ());
    si (rand == 0) {
    ++ rand;
    }

    No me generó todas las citas porque “No creo que el Recuento de SELECCIÓN calculó todas las citas correctamente y siempre omitió la última cita ingresada. Entonces, el +1 lo solucionó y eliminó la necesidad de la declaración if. ¡Impresionante sitio web! Guarde sus tutoriales, para un escritor de Android, puede comprender fácilmente. Pacon.

  • Stephen Pengilley dice:

    ¡Gracias por el tutorial!

    También obtengo un bloqueo cuando hago clic en el botón para poner la cita escrita en la base de datos. No puedo poner tostadas en ningún lugar que aparezca antes del bloqueo SIN que haga clic en el otro botón. Esto devuelve un punto cero (supongo que porque no hay citas).

    Creo que el error estaría dentro del caso (si funciona para un botón y no para el otro) pero no creo que sea

    ¿Algunas ideas?

  • ludado1978 dice:

    Hice lo que estaba escrito en este tutorial, pero cuando el programa se ejecuta en un emulador, me dice “¡Lo siento!
    La aplicación RandomQuotes (paquete …) se detuvo inesperadamente. Inténtalo de nuevo “

    Alguien me puede ayudar con eso?

    No puedo continuar con el siguiente tutorial sin resolver este problema.

    Gracias.

  • Jim dice:

    ¡Gracias por el tutorial!
    ¡Funciona muy bien!
    ~ J

  • Ben dice:

    playplay1978, también me bloqueó, debido a errores tipográficos que hice en el nombre de mi paquete, verifiqué dos veces que AndroidManifest.xml, DBAdapter.java y QuotesMain.java tienen el mismo nombre de paquete. Debido a ese error también tuve “R es insoluble”.

  • Dave dice:

    ¡Muchas gracias por el gran tutorial, Greg!

  • Jared dice:

    Como se mencionó dos veces …

    int rand = random.nextInt (getAllEntries ());

    debiera ser….

    int rand = 1 + random.nextInt (getAllEntries ());

    La razón se debe a que las bases de datos son 1+ y java cuentan 0+

    A menos que esté muy equivocado …

  • Martín dice:

    Gracias por estos tutoriales. Sin embargo, tengo un pequeño problema. En mi QuotesMain.java obtengo muchos errores de “DBAdapter no se puede resolver para escribir”. Revisé todo con las imágenes (está bien, duermo mucho en un autómata), pero aparentemente no puedo entender por qué eso lo está causando. Si alguien tiene ayuda, se lo agradecería mucho.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *