Almacenamiento persistente de Android (3) Uso de la base de datos SQLite

1. ¿Qué es SQlite?

SQLite es una base de datos ligera escrita en lenguaje C. Debido a su pequeño consumo de recursos, velocidad de procesamiento rápida y funciones completas, es especialmente adecuada para dispositivos móviles. Lo más importante es el código abierto, cualquiera puede usarlo. ) Y los dos principales sistemas operativos de teléfonos móviles de la actualidad, Android e iOS, utilizan SQLite, lo que convierte a SQLite en el motor de base de datos más común del mundo.

2. Características de SQLite

Además de las ventajas del pequeño consumo de recursos y la rápida velocidad de procesamiento, SQLite tiene sus propias características, es decir, admite tipos de datos débiles.Otras bases de datos SQL convencionales generalmente admiten datos fuertemente tipados, es decir, el tipo de cada columna debe especificarse de antemano. Si los datos y el tipo de datos especificado no coinciden, se informa un error y SQLite usa un tipo débil, es decir, cuando crea una tabla, especifique el tipo de datos de una columna, pero puede insertar cualquier tipo de datos en la columna, SQLite verificará su Tipo. Si el tipo no coincide con la columna asociada, SQLite intentará convertir el valor al tipo de la columna. Si no se puede convertir, el valor se almacenará como el tipo que tiene.

SQLite admite los siguientes tipos de datos: NULL, INTEGER, REAL, TEXT y BLOB

  • NULL: el valor es nulo;
  • INTEGER: El valor es un entero con signo, almacenado en 1, 2, 3, 4, 6 u 8 bytes según el tamaño del valor;
  • REAL: este valor es un valor de coma flotante, almacenado como un número de coma flotante de 8 bytes;
  • TEXTO: El valor es una cadena de texto, almacenada usando la codificación de la base de datos (UTF-8, UTF-16BE o UTF-16LE);
  • BLOB: el valor es un bloque de datos BLOB, almacenado en el formato de datos de entrada.

3. Android usa SQLite

Como se mencionó anteriormente, Android integra la base de datos SQLite y, al mismo tiempo, Android también proporciona API que usan la base de datos SQLite, que se pueden usar para las operaciones de la base de datos.

3.1 Introducción a SQLiteOpenHelper

SQLiteOpenHelper es una clase de ayuda de SQLite proporcionada por Android, utilizada para administrar la base de datos (incluyendo crear, agregar, eliminar, cambiar) y administrar la versión de la base de datos para facilitar a los desarrolladores operar SQLite. Los métodos básicos de SQLiteOpenHelper son los siguientes (más información, consulte el documento oficial https: // developer.android.google.cn/reference/android/database/sqlite/SQLiteOpenHelper?hl=zh-cn)

Nombre del método Descripción
onCreate () Este método se ejecuta cuando la base de datos se crea por primera vez. Si la base de datos no existe, se crea. El método onCreate () se llama solo cuando se llama a la base de datos por primera vez. Al reescribir el método onCreate (), se genera la estructura de la tabla de datos
onUpgrade () Se llama al método cuando la base de datos debe actualizarse. Este método detecta si el número de versión pasado en la base de datos es el mismo que el número de versión actual. Si el número de versión pasado es mayor que la versión anterior, el método se activa
getReadableDatabase () Crear o abrir una base de datos legible
getWritableDatabase () Crear una base de datos abierta legible / grabable
cerrar() Cierre todos los objetos abiertos de la base de datos.

onCreat y onUpgrade son implementados por desarrolladores y son llamados por SQLiteOpenHelper.

Entre ellos, onCreat es cuando SQLiteOpenHelper intenta encontrar la base de datos, si no se encuentra, ejecute este método, ¿cuándo va SQLiteOpenHelper a la base de datos? ¿Al crear una instancia de SQLiteOpenHelper, o al usar getWritableDatabase () o getReadableDatabase () de SQLiteOpenHelper para obtener SQLiteDatabase?

Podemos usar el código para verificar que agreguemos una bandera como bandera en el código MySQLiteOpenHelper que hereda SQLiteOpenHelper, el valor inicial de la bandera es 0, luego lo asigna a 100 en el constructor y finalmente agrega el código de impresión en onCreate Luego, primero instanciamos solo MySQLiteOpenHelper en la Actividad, sin obtener la base de datos, para ver si se activa la información de impresión en onCreate. Luego agregue los java SQLiteDatabase sqLiteDatabase= mySQLiteOpenHelper.getWritableDatabase();datos adquiridos y luego vea la información de impresión.

El código de actividad es el siguiente:

package com.test.sqlitedemo;

import androidx.appcompat.app.AppCompatActivity;

import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    MySQLiteOpenHelper mySQLiteOpenHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"test",1);

    }
}

El código MySQLiteOpenHelper es el siguiente:

package com.test.sqlitedemo;

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

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    private int flag=0;

    /**
     *
     * @param context
     * @param name 数据库名称
     * @param version 数据库版本号 当想升级数据库时,填入大于当前版本号的数
     */
    public MySQLiteOpenHelper(Context context, String name, int version) {
        super(context, name, null, version);
        //这里赋值成100
        flag=100;
    }

    /**
     *
     * @param db SQLiteDatabase数据库对象
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d("MySQLiteOpenHelper", "flag="+flag);
        //新建数据表
        db.execSQL("create table translog(_id integer primary key autoincrement, transid , amount,date)");
        flag=50;
    }

    /**
     *
     * @param db
     * @param oldVersion 旧版本号
     * @param newVersion 新版本号
     */

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("MySQLiteOpenHelper", oldVersion + "------->" + newVersion);
    }

}

El resultado de la verificación es que solo instanciar MySQLiteOpenHelper no activa la información de impresión en onCreate. Al adquirir la base de datos, SQLiteOpenHelper llamará al método onCreate. Después de que la aplicación se cierre y luego se abra, la información de impresión no se activará porque la base de datos ha sido creada. (Verifique durante mucho tiempo aquí, y luego descubrió que el sitio web oficial lo dejó claro en una oración cuando se creó la base de datos:

Cree un objeto auxiliar para crear, abrir y / o administrar una base de datos. Este método siempre vuelve muy rápido.The database is not actually created or opened until one of getWritableDatabase() or getReadableDatabase() is called

Veamos el método onUpgrade. Este método se llama cuando la base de datos debe actualizarse. Este método se activa cuando se pasa SQLiteOpenHelper y el parámetro de versión es mayor que la versión actual. Los desarrolladores se enfrentan a menudo a la actualización de la base de datos, y la mayoría de las veces los datos anteriores no se pueden eliminar al actualizar la base de datos. Los desarrolladores pueden agregar código para mover los datos en la función onUpgrade y ejecutar la lógica de movimiento una vez que se inicia la actualización.

Alguien puede preguntar, ¿SQLiteOpenHelper es solo para ayudar a verificar si la base de datos existe y actualizarla? Si se trata solo de estas dos funciones, aunque puede ayudar a los desarrolladores a ahorrar un poco de trabajo, ¡pero no mucho trabajo! No olvide usar getWritableDatabase o getWritableDatabase para obtener una instancia de base de datos, cambiar a otra plataforma para operar la base de datos y armar lentamente la declaración de conexión de la base de datos, lo que también ahorra mucho trabajo. También se pueden operar otras degradaciones de la base de datos a través de esta clase. Para más detalles, consulte la documentación oficial.

3.2 Crear una base de datos

Después de comprender SQLiteOpenHelper, puede comenzar a practicar el recorrido de la base de datos. Para el código de creación de la base de datos, vea la instrucción Crear SQL en onCreate arriba. Esta declaración crea una tabla llamada translog, que se utiliza para registrar registros de transacciones. La tabla de translog tiene 4 columnas, que son la identificación de la clave primaria, el número de transacción, la cantidad y la fecha. Tenga en cuenta que además de _idestablecerse en el tipo entero (porque la clave primaria de auto crecimiento) está configurada ), No se especifican otras columnas, la implementación no informará un error, este es el beneficio del tipo de datos débil de SQLite.

db.execSQL("create table translog(_id integer primary key autoincrement, transid , amount,date)");

3.3 Agregar datos

Hay dos formas de agregar datos a la tabla: una es usar una declaración SQL nativa. Agregar una declaración SQL de registro de transacciones a la tabla de la siguiente manera

db.execSQL("INSERT INTO translog (transid, amount,date)"+ 
"VALUES ('955162020', 100.00,20200305)");

Hay un segundo método que también es un poco más simple de mover, es decir, usar los métodos insert (), update (), delete (), query () proporcionados por el objeto SQLiteDatabase. Estos métodos realmente hacen una capa de encapsulación, y finalmente los convierten en declaraciones SQL internamente para completar la operación de inserción de datos.

Agregar inserción de datos (tabla de cadenas, cadena nullColumnHack, valores de ContentValues) tiene 3 parámetros, que incluyen:

  • Nombre de la tabla del parámetro 1;
  • Parámetro 2 El valor predeterminado de la columna vacía;
  • Parámetro 3 Datos de tipo ContentValues;

El segundo parámetro nullColumnHack es el valor predeterminado de la columna vacía, pero también se puede rellenar con nulo. Sabemos que SQL no permite la inserción sin especificar un nombre de columna, como *** INSERT INTO translog () VALUES () ") *** está mal, si el tercer parámetro es nulo, se producirá este error de sintaxis, el segundo parámetro es solo para evitar el nacimiento del error, por lo que cuando el tercer parámetro es nulo, se utiliza el segundo El parámetro se usa como el campo predeterminado. Entonces, ¿por qué puede establecerse en nulo? Esto es posible cuando el tercer parámetro no es nulo y el número de elementos es mayor que 0. La idea de este parámetro es que si usted es demasiado vago para verificar si el tercer parámetro es Si está vacío, complete un parámetro para permitirme controlarlo. Si completa un valor nulo para no permitirme controlar, debe prestar atención al tercer parámetro que no puede estar vacío.

El tercer parámetro es el valor del tipo ContentValues. Su uso es similar al del mapa. Proporciona métodos put y get para acceder a los datos. Tenga en cuenta que la clave debe ser el nombre de la columna que existe en la tabla.

El siguiente es un ejemplo de inserción de código. Tenga en cuenta que no agregamos un valor a la clave primaria. Hemos establecido la clave primaria para que sea una columna de aumento automático. Cuando no se coloca ningún valor en una columna en ContentValues, es equivalente a agregar un valor nulo a la columna. La clave primaria es automáticamente Aumente, pero si se asigna el valor, la identificación se establece en el valor después de la asignación. Se recomienda dejar que la identificación aumente automáticamente. Si no presta atención a su asignación, hará que la identificación se repita e informe un error.

//实例化常量值
ContentValues cValue = new ContentValues();
//添加交易单号
cValue.put("transid","9551620200307");
//添加消费金额
cValue.put("amount",100.00);
//添加交易日期
cValue.put("date",2020-03-07);
//调用insert()方法插入数据
db.insert("translog",null,cValue);

3.4 Actualizar datos

Por supuesto, también puede usar la instrucción SQL nativa para actualizar los datos y luego usar el método execSQL () para lograr el propósito, o usar la función update ()

int update(String table, ContentValues values, String whereClause, String[] whereArgs)
  • Nombre de la tabla del parámetro 1;
  • Parámetro 2 ContentValues ​​tipo datos;
  • Parámetro 3 WHERE expresión (String), especifique la fila que se actualizará, ¿dónde? El número es un marcador de posición, si se pasa nulo, se actualizarán todas las filas;
  • El parámetro 4 rellena el marcador de posición en el tercer parámetro, tipo de matriz String [];

Por ejemplo, si desea actualizar el monto de la transacción de *** 9551620200307 ***, puede usar el siguiente código

ContentValues replaceAmount = new ContentValues();
//要修改的金额
replaceAmount.put("amount","50.00");
//指定第3个参数里占位符?的内容,最后将翻译成transid=9551620200307
String[] parms=new String[] {"9551620200307"}; 
//执行更新
db.update("translog", replaceAmount, "transid=?", parms);

3.5 Eliminar datos

Después de familiarizarse con las funciones de adición y modificación, se descubre que todas las funciones se discuten de manera fija. Los parámetros de la función eliminar y eliminar son muy similares, excepto que faltan los parámetros que se agregarán, porque la eliminación es destrucción y la destrucción es simple.

public int delete (String table, String whereClause, String[] whereArgs)
  • Nombre de la tabla del parámetro 1;
  • Parámetro 2 WHERE expresión (String), especifique la fila que se va a eliminar, ¿cuál? El número es un marcador de posición, si se pasa nulo se eliminarán todas las filas;
  • Parámetro 3: rellene el marcador de posición en el segundo parámetro, tipo de matriz String [];

Por ejemplo, si desea eliminar el registro de transacción *** 9551620200307 ***, puede usar el siguiente código

//指定第3个参数,也就是占位符?的内容,最后将翻译成transid=9551620200307
String[] parms=new String[] {"9551620200307"}; 
//执行更新
db.delete("translog", "transid=?", parms);

3.6 Datos de consulta

El método de consulta se pone al final, porque la consulta es más complicada, si se trata de consultar todos los datos, de lo contrario es necesario especificar varias condiciones. Al igual que con la función anterior, hay dos formas de consultar, pero debe tenerse en cuenta que la consulta nativa SQL no es compatible con db.execSQL, pero utiliza el método db.rawQuery establecido por separado para la consulta. Hay dos tipos de métodos rawQuery, de los cuales el más simple El prototipo es el siguiente:

 Cursor rawQuery (String sql, String[] selectionArgs)

El primer parámetro es la instrucción SQL, y el segundo parámetro se usa para llenar el marcador de posición en el primer parámetro. rawQuery devuelve Cursor y finalmente encuentra el resultado de la consulta deseada a través de Cursor. El código de muestra es el siguiente:

Cursor cursor = db.rawQuery("select * from transid",null); 

while(cursor.moveToNext()){
			int id=cursor.getInt(cursor.getColumnIndex("id");

			String transid=cursor.getString(cursor.getColumnIndex("transid"));

            String amount=cursor.getString(cursor.getColumnIndex("amount"));

            String date=cursor.getString(cursor.getColumnIndex("date"));		
		}

rawQuery es más adecuado para consultas simples. Si desea establecer más condiciones, usar este método será muy complicado. En este momento, se recomienda utilizar el método de consulta. Aunque los parámetros son mucho más que las adiciones, eliminaciones y cambios de la base de datos descritos anteriormente, son más legibles que las declaraciones de consulta SQL nativas.

Eche un vistazo a uno de los prototipos de consulta:

Cursor query (boolean distinct, 
                String table, 
                String[] columns, 
                String selection, 
                String[] selectionArgs, 
                String groupBy, 
                String having, 
                String orderBy, 
                String limit);

Descripción del parámetro

  • distinto: especifica si se deben filtrar valores duplicados en los resultados, filtrado verdadero, falso no filtrado;
  • tabla: nombre de la tabla
  • columnas: especifique el conjunto de nombres de las columnas que desea consultar;
  • selección: declaración condicional después de DONDE, se pueden usar marcadores de posición
  • selectionArgs: si hay un marcador de posición en la selección, use este parámetro para completar
  • groupBy: especifica el par de nombre de columna del grupo, si se especifica, el resultado se agrupará de acuerdo con el nombre de la columna
  • teniendo: Especifique las condiciones de agrupación, usadas con groupBy
  • orderBy: especifique el nombre de la columna para ordenar
  • límite: se usa para limitar el número de filas devueltas

Además de la tabla que se debe especificar, otros parámetros se pueden establecer en nulo, que es equivalente a una oración simple select * from table.

Conclusión

Android utiliza SQLite debido a su excelente rendimiento, tamaño pequeño y código abierto. Si los programas de Android necesitan guardar una gran cantidad de datos, es una solución inteligente elegir SQLite. Android encapsula una API simple y fácil de usar para SQLite, donde la clase SQLiteOpenHelper se usa para crear y actualizar bases de datos A través de SQLiteOpenHelper, los desarrolladores no tienen que preocuparse por crear conexiones de bases de datos y otras operaciones engorrosas. En Android, puede optar por usar sentencias SQL nativas u operaciones de API encapsuladas. La API incluye las operaciones básicas de agregar, eliminar, modificar y verificar la base de datos. Al usar la API, no solo facilita a los desarrolladores, sino que también mejora la legibilidad del programa. Sin embargo, la API empaquetada de Android sigue siendo un poco engorrosa. Hay una gran cantidad de bibliotecas de terceros útiles que pueden facilitar el funcionamiento de la base de datos, que se presentará más adelante.

Se han publicado 19 artículos originales · ganado elogios 6 · vistas 6439

Supongo que te gusta

Origin blog.csdn.net/lansoul1987/article/details/104713895
Recomendado
Clasificación