Problemas al usar LitePal

Hubo un problema al actualizar a los valores predeterminados.

Descripción del problema

Defina una tabla de estudiantes.

public class Student extends LitePalSupport {
    
    
    //主键
    public long id;
    //姓名
    public String name;
    //是否是男生,且设置默认值为false
    public boolean isMale = false;
    //学号
    public String sno;

    @Override
    public String toString() {
    
    
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", isMale=" + isMale +
                ", sno='" + sno + '\'' +
                '}';
    }
}

Mantener un registro del estudiante.

        Student student = new Student();
        student.name = "张三";
        student.isMale = true;
        student.sno = "0001";
        student.save();

Ejecute el siguiente código para actualizar el campo isMale

        Student student = LitePal.where("name = ?", "张三")
                .findFirst(Student.class);
        Logger.d("原student: "+student);
        student.isMale = false;//更新isMale字段为false
        boolean isUpdateSucc = student.update(student.id) > 0;
        Logger.d("更新isMale是否成功:"+isUpdateSucc);
        student = LitePal.where("name = ?", "张三")
                .findFirst(Student.class);
        Logger.d("新student: "+student);

El registro de salida es el siguiente:

原student: Student{
    
    name='张三', isMale=true, sno='0001'}
更新isMale是否成功:true
新student: Student{
    
    name='张三', isMale=true, sno='0001'}

Se puede ver en el registro que el campo isMale no se actualizó correctamente.
La razón es que el método de actualización de LitePal solo actualizará el campo si el valor del campo no es el valor predeterminado.

Solución

Método 1: setToDefaultmétodo de uso

        Student student = LitePal.where("name = ?", "张三")
                .findFirst(Student.class);
        Logger.d("原student: "+student);
//        student.isMale = false;//更新isMale字段为false
        student.setToDefault("isMale");//更新isMale字段为false
        boolean isUpdateSucc = student.update(student.id) > 0;
        Logger.d("更新isMale是否成功:"+isUpdateSucc);
        student = LitePal.where("name = ?", "张三")
                .findFirst(Student.class);
        Logger.d("新student: "+student);

El registro de salida es el siguiente:

原student: Student{
    
    name='张三', isMale=true, sno='0001'}
更新isMale是否成功:true
新student: Student{
    
    name='张三', isMale=false, sno='0001'}

Método 2: utilice save()el método para guardar datos en su lugar

        Student student = LitePal.where("name = ?", "张三")
                .findFirst(Student.class);
        Logger.d("原student: "+student);
        student.isMale = false;//更新isMale字段为false
        boolean isUpdateSucc = student.save();//改成用save()保存字段
        Logger.d("更新isMale是否成功:"+isUpdateSucc);
        student = LitePal.where("name = ?", "张三")
                .findFirst(Student.class);
        Logger.d("新student: "+student);

El registro de salida es el siguiente:

原student: Student{
    
    name='张三', isMale=true, sno='0001'}
更新isMale是否成功:true
新student: Student{
    
    name='张三', isMale=false, sno='0001'}

save()El método consiste en sobrescribir cada campo directamente, sin importar si el valor del campo actual es el valor predeterminado o no.
Sin embargo, cabe señalar que si la tabla tiene otra tabla asociada, no se recomienda este método, porque se borrará la clave externa de la tabla asociada.

Método de referencia:
Actualizar datos: no se pueden actualizar a 0 desde otros tipos

Hubo un problema al actualizar la tabla asociada.

Descripción del problema

Estudiante y Libro es una relación de uno a muchos.

public class Student extends LitePalSupport {
    
    
    //主键
    public long id;
    //姓名
    public String name;
    //是否是男生,且设置默认值为false
    public boolean isMale = false;
    //学号
    public String sno;

    public List<Book> books = new ArrayList<>();

    @Override
    public String toString() {
    
    
        return "Student{" +
                "name='" + name + '\'' +
                ", isMale=" + isMale +
                ", sno='" + sno + '\'' +
                ", books=" + books +
                '}';
    }
}

public class Book extends LitePalSupport {
    
    
    //主键
    public long id;
    //书名
    public String name;

    public Student student;

    @Override
    public String toString() {
    
    
        return "Book{" +
                "name='" + name + '\'' +
                '}';
    }
}

Agregue 2 libros para "Zhang San"

        Student student = LitePal.where("name = ?", "张三").findFirst(Student.class);

        Book chineseBook = new Book();
        chineseBook.name = "语文";
        chineseBook.student = student;
        chineseBook.save();

        Book mathBook = new Book();
        mathBook.name = "数学";
        mathBook.student = student;
        mathBook.save();

En este momento, la tabla de estudiantes y la tabla de libros son las
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
siguientes. A continuación, actualice el número de estudiante de Zhang San y agregue un libro para Zhang San.

        Student student = LitePal.where("name = ?", "张三").findFirst(Student.class);
        Logger.d("查询到的student: "+student);
        student.sno = "0002";
        student.save();

        Book englishBook = new Book();
        englishBook.name = "英语";
        englishBook.student = student;
        englishBook.save();

Después de ejecutar el código anterior, el registro de salida es el siguiente

查询到的student: Student{
    
    name='张三', isMale=true, sno='0001', books=[]}

En este momento, la tabla Estudiante y la tabla Libro son las siguientes

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Se puede ver en la figura que las claves foráneas de los libros del idioma original y de los libros de matemáticas se dejan en blanco. Porque el modo predeterminado de LitePal es la consulta diferida. Por lo tanto, cuando se pregunta a Zhang San, el de Zhang San bookses un conjunto vacío. En este momento, si llama save()al método directamente, LitePal pensará que desea borrar la relación, por lo que las claves externas del libro chino y del libro de matemáticas están todas en blanco.

Solución

Método 1: utilice update()la actualización en su lugar

        Student student = LitePal.where("name = ?", "张三").findFirst(Student.class);
        Logger.d("查询到的student: "+student);
        student.sno = "0002";
        student.update(student.id);

        Book englishBook = new Book();
        englishBook.name = "英语";
        englishBook.student = student;
        englishBook.save();

Ejecute el código anterior, el registro de salida es el siguiente

查询到的student: Student{
    
    name='张三', isMale=true, sno='0001', books=[]}

En este momento, la tabla Estudiante y la tabla Libro son las siguientes
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Método dos: utilice consultas agresivas en su lugar

        Student student = LitePal.where("name = ?", "张三").findFirst(Student.class, true);//此处改用激进查询
        Logger.d("查询到的student: "+student);
        student.sno = "0002";
        student.save();

        Book englishBook = new Book();
        englishBook.name = "英语";
        englishBook.student = student;
        englishBook.save();

Después de ejecutar el código anterior, se genera el siguiente registro

查询到的student: Student{
    
    name='张三', isMale=true, sno='0001', books=[Book{
    
    name='语文'}, Book{
    
    name='数学'}]}

Los resultados de la tabla Estudiante y la tabla Libro son los mismos que los del método uno.

Método de referencia:
use guardar para actualizar los datos en la tabla de datos en lugar de actualizar, y luego los datos de la tabla que usan la identificación de la tabla como clave externa no se consultarán

Problemas al empalmar declaraciones de consulta donde

Descripción del problema

Se produce una excepción cuando el valor del campo concatenado es un carácter chino

    String whereName = "name = 张三";
    Student student = LitePal.where(whereName).findFirst(Student.class);
    Logger.d("查询到的student: "+student);

La ejecución del código anterior generará la siguiente excepción
LitePalSupportException: no existe tal columna: Zhang San (código 1): , mientras se compila: SELECT * FROM Student WHERE nombre = Zhang San LIMIT 1

Cuando el valor del campo concatenado es una cadena numérica cuyo primer dígito es 0, no se pueden consultar registros

   String whereSno = "sno = 0001";
   Student student = LitePal.where(whereSno).findFirst(Student.class);
   Logger.d("查询到的student: "+student);

Ejecute el código anterior, el registro de salida es el siguiente

查询到的student: null

Solución

Método 1: incluya el valor del campo entre comillas simples al empalmar

//  String whereName = "name = 张三";
    String whereName = "name = '张三'";
    Student student = LitePal.where(whereName).findFirst(Student.class);
    Logger.d("查询到的student: "+student);

//  String whereSno = "sno = 0001";
    String whereSno = "sno = '0001'";
    Student student = LitePal.where(whereSno).findFirst(Student.class);
    Logger.d("查询到的student: "+student);

Después de ejecutar el código anterior, el registro de salida es el siguiente

查询到的student: Student{
    
    name='张三', isMale=true, sno='0001'}
查询到的student: Student{
    
    name='张三', isMale=true, sno='0001'}

Método 2: utilizar el marcador de posición de LitePal (?)

    Student student = LitePal.where("name = ?", "张三").findFirst(Student.class);
    Logger.d("查询到的student: "+student);

    student = LitePal.where("sno = ?", "0001").findFirst(Student.class);
    Logger.d("查询到的student: "+student);

Después de ejecutar el código anterior, el registro de salida es el siguiente

查询到的student: Student{
    
    name='张三', isMale=true, sno='0001'}
查询到的student: Student{
    
    name='张三', isMale=true, sno='0001'}

Supongo que te gusta

Origin blog.csdn.net/jiejingguo/article/details/124496642
Recomendado
Clasificación