Beim Aktualisieren auf die Standardeinstellungen ist ein Problem aufgetreten
Problembeschreibung
Definieren Sie eine Student-Tabelle.
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 + '\'' +
'}';
}
}
Führen Sie eine Schülerakte.
Student student = new Student();
student.name = "张三";
student.isMale = true;
student.sno = "0001";
student.save();
Führen Sie den folgenden Code aus, um das Feld isMale zu aktualisieren
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);
Das Ausgabeprotokoll lautet wie folgt:
原student: Student{
name='张三', isMale=true, sno='0001'}
更新isMale是否成功:true
新student: Student{
name='张三', isMale=true, sno='0001'}
Aus dem Protokoll geht hervor, dass das Feld isMale nicht erfolgreich aktualisiert wurde.
Der Grund dafür ist, dass die Update-Methode von LitePal das Feld nur dann aktualisiert, wenn der Feldwert nicht der Standardwert ist.
Lösung
Methode 1: setToDefault
Methode verwenden
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);
Das Ausgabeprotokoll lautet wie folgt:
原student: Student{
name='张三', isMale=true, sno='0001'}
更新isMale是否成功:true
新student: Student{
name='张三', isMale=false, sno='0001'}
Methode 2: Verwenden Sie stattdessen save()
die Methode zum Speichern von Daten
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);
Das Ausgabeprotokoll lautet wie folgt:
原student: Student{
name='张三', isMale=true, sno='0001'}
更新isMale是否成功:true
新student: Student{
name='张三', isMale=false, sno='0001'}
save()
Die Methode besteht darin, jedes Feld direkt zu überschreiben, unabhängig davon, ob der aktuelle Feldwert der Standardwert ist oder nicht.
Es ist jedoch zu beachten, dass diese Methode nicht empfohlen wird, wenn der Tabelle eine andere Tabelle zugeordnet ist, da der Fremdschlüssel der zugehörigen Tabelle gelöscht wird.
Referenzmethode:
Daten aktualisieren: Kann von anderen Typen nicht auf 0 aktualisiert werden
Beim Aktualisieren der zugehörigen Tabelle ist ein Problem aufgetreten
Problembeschreibung
Schüler und Buch sind eine Eins-zu-Viele-Beziehung.
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 + '\'' +
'}';
}
}
2 Bücher für „Zhang San“ hinzufügen
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();
Zu diesem Zeitpunkt sehen die Tabelle „Student“ und die Tabelle „Book“ wie
folgt aus: Aktualisieren Sie als Nächstes die Studentennummer von Zhang San und fügen Sie ein Buch für Zhang San hinzu
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();
Nach der Ausführung des obigen Codes sieht das Ausgabeprotokoll wie folgt aus
查询到的student: Student{
name='张三', isMale=true, sno='0001', books=[]}
Zu diesem Zeitpunkt lauten die Student-Tabelle und die Book-Tabelle wie folgt
Aus der Abbildung ist ersichtlich, dass die Fremdschlüssel der Originalsprachenbücher und Mathematikbücher leer bleiben. Denn der Standardmodus von LitePal ist Lazy Query. Wenn Zhang San abgefragt wird, ist Zhang San daher books
eine leere Menge. Wenn Sie save()
die Methode zu diesem Zeitpunkt direkt aufrufen, geht LitePal davon aus, dass Sie die Beziehung löschen möchten, sodass die Fremdschlüssel des chinesischen Buches und des Mathematikbuchs alle leer sind.
Lösung
Methode 1: Verwenden Sie stattdessen update()
Update
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();
Führen Sie den obigen Code aus. Das Ausgabeprotokoll lautet wie folgt
查询到的student: Student{
name='张三', isMale=true, sno='0001', books=[]}
Zu diesem Zeitpunkt lauten die Student-Tabelle und die Book-Tabelle wie folgt
Methode zwei: Verwenden Sie stattdessen aggressive Abfragen
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();
Nach der Ausführung des obigen Codes wird das folgende Protokoll ausgegeben
查询到的student: Student{
name='张三', isMale=true, sno='0001', books=[Book{
name='语文'}, Book{
name='数学'}]}
Die Ergebnisse der Student-Tabelle und der Book-Tabelle sind die gleichen wie bei Methode eins.
Probleme beim Zusammenfügen von Where-Abfrageanweisungen
Problembeschreibung
Eine Ausnahme wird ausgelöst, wenn der verkettete Feldwert ein chinesisches Zeichen ist
String whereName = "name = 张三";
Student student = LitePal.where(whereName).findFirst(Student.class);
Logger.d("查询到的student: "+student);
Das Ausführen des obigen Codes löst die folgende Ausnahme aus
: LitePalSupportException: no such columns: Zhang San (code 1): , beim Kompilieren: SELECT * FROM student WHERE name = Zhang San LIMIT 1
Wenn der verkettete Feldwert eine numerische Zeichenfolge ist, deren erste Ziffer 0 ist, können keine Datensätze abgefragt werden
String whereSno = "sno = 0001";
Student student = LitePal.where(whereSno).findFirst(Student.class);
Logger.d("查询到的student: "+student);
Führen Sie den obigen Code aus. Das Ausgabeprotokoll lautet wie folgt
查询到的student: null
Lösung
Methode 1: Schließen Sie den Feldwert beim Spleißen in einfache Anführungszeichen ein
// 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);
Nach der Ausführung des obigen Codes sieht das Ausgabeprotokoll wie folgt aus
查询到的student: Student{
name='张三', isMale=true, sno='0001'}
查询到的student: Student{
name='张三', isMale=true, sno='0001'}
Methode 2: Verwenden Sie den Platzhalter von 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);
Nach der Ausführung des obigen Codes sieht das Ausgabeprotokoll wie folgt aus
查询到的student: Student{
name='张三', isMale=true, sno='0001'}
查询到的student: Student{
name='张三', isMale=true, sno='0001'}