Problemas ao usar LitePal

Ocorreu um problema ao atualizar para o padrão

Descrição do Problema

Defina uma tabela Aluno.

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 + '\'' +
                '}';
    }
}

Mantenha um registro do aluno.

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

Execute o seguinte código para atualizar o 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);

O log de saída é o seguinte:

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

Pode-se observar no log que o campo isMale não foi atualizado com êxito.
A razão é que o método de atualização do LitePal só atualizará o campo se o valor do campo não for o valor padrão.

Solução

Método 1: setToDefaultcomo usar

        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);

O log de saída é o seguinte:

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

Método 2: use save()o método para salvar dados

        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);

O log de saída é o seguinte:

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

save()O método consiste em substituir cada campo diretamente, independentemente de o valor do campo atual ser o valor padrão ou não.
Porém, deve-se ressaltar que se a tabela possuir outra tabela associada a ela, este método não é recomendado, pois a chave estrangeira da tabela associada será limpa.

Método de referência:
Atualizar dados: não pode ser atualizado para 0 de outros tipos

Ocorreu um problema ao atualizar a tabela associada

Descrição do Problema

Aluno e Livro é um relacionamento um-para-muitos.

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 + '\'' +
                '}';
    }
}

Adicione 2 livros 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();

Neste momento, a tabela de alunos e a tabela de livros são as
insira a descrição da imagem aqui
insira a descrição da imagem aqui
seguintes. Em seguida, atualize o número de aluno de Zhang San e adicione um livro 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();

Depois de executar o código acima, o log de saída é o seguinte

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

Neste momento, a tabela do Aluno e a tabela do Livro são as seguintes

insira a descrição da imagem aqui
insira a descrição da imagem aqui
Pode-se observar na figura que as chaves estrangeiras dos livros no idioma original e dos livros de matemática são deixadas em branco. Porque o modo padrão do LitePal é a consulta lenta. Portanto, quando Zhang San é questionado, o de Zhang San booksé um conjunto vazio. Neste momento, se você chamar save()o método diretamente, o LitePal pensará que você deseja limpar o relacionamento, então as chaves estrangeiras do livro chinês e do livro de matemática ficarão todas em branco.

Solução

Método 1: use update()a atualização

        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();

Execute o código acima, o log de saída é o seguinte

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

Neste momento, a tabela do Aluno e a tabela do Livro são as seguintes
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Método dois: use consultas agressivas

        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();

Depois de executar o código acima, o seguinte log é gerado

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

Os resultados da tabela Student e da tabela Book são iguais aos do método um.

Método de referência:
use salvar para atualizar os dados na tabela de dados em vez de atualizar, e então os dados da tabela que usam o id da tabela como chave estrangeira não serão consultados

Problemas ao unir instruções de consulta where

Descrição do Problema

Uma exceção é lançada quando o valor do campo concatenado é um caractere chinês

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

A execução do código acima gerará a seguinte exceção
LitePalSupportException: no such column: Zhang San (code 1): , durante a compilação: SELECT * FROM student WHERE name = Zhang San LIMIT 1

Quando o valor do campo concatenado é uma string numérica cujo primeiro dígito é 0, nenhum registro pode ser consultado

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

Execute o código acima, o log de saída é o seguinte

查询到的student: null

Solução

Método 1: coloque o valor do campo entre aspas simples ao unir

//  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);

Depois de executar o código acima, o log de saída é o seguinte

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

Método 2: Use o espaço reservado do 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);

Depois de executar o código acima, o log de saída é o seguinte

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

Acho que você gosta

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