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: setToDefault
como 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
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
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
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'}