Probleme bei der Verwendung von LitePal

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: setToDefaultMethode 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
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
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

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
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 bookseine 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
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

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.

Referenzmethode:
Verwenden Sie Speichern, um die Daten in der Datentabelle zu aktualisieren, anstatt sie zu aktualisieren. Anschließend werden die Tabellendaten, die die ID der Tabelle als Fremdschlüssel verwenden, nicht abgefragt

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'}

Ich denke du magst

Origin blog.csdn.net/jiejingguo/article/details/124496642
Empfohlen
Rangfolge