Android Litepal数据库查询数据时的错误

本文介绍了一种在使用findAll方法查询包含外键关联的数据表时的方法,通过设置激进查询参数为true来确保能够获取到相关联表中的数据。但此方法查询速度较慢且不支持迭代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

findAll使用时遇到的问题

当我们用findAll查询数据时,一般情况下都是可以查询到的,但是当我们的表中有一个外键时,如以下代码:Song是与Album相关联的一个表,这里Album与Song是一对多的关系

public class Album extends DataSupport {
    private String name;
    private double price;
    private List<Song> songs = new ArrayList<Song>();
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Song> getSongs() {
        return songs;
    }

    public void setSongs(List<Song> songs) {
        this.songs = songs;
    }
    public void addSong(Song song)
    {
        this.songs.add(song);
    }
    public Album(double price,String name)
    {
        this.price=price;
        this.name=name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getPrice() {
        return price;
    }
}

Song.java代码

public class Song extends DataSupport {
    private String name;
    private String songer;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSonger() {
        return songer;
    }

    public void setSonger(String songer) {
        this.songer = songer;
    }
    public Song(String name,String songer)
    {
        this.songer=songer;
        this.name=name;
    }
}

主函数MainActivity.java

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        SQLiteDatabase db=LitePal.getDatabase();
        bindId();
        addDate();
    }
    private void addDate()
    {
        if(!DataSupport.findAll(Album.class).isEmpty())
        {
            DataSupport.deleteAll(Album.class);
            DataSupport.deleteAll(Song.class);
        }
        Song song = new Song("123","1223");
        song.save();
        Song song1 = new Song("233","121212");
        song1.save();
        Song song2 = new Song("23232323","34424232432");
        song2.save();
        Album album = new Album(1.32,"121212");
        album.addSong(song);
        album.addSong(song1);
        album.addSong(song2);
        album.save();
        Album album1 = new Album(2.34,"@3433422");
        album1.addSong(song1);
        album1.save();
        List<Album> albums = DataSupport.findAll(Album.class,true);
        Album album2 = albums.get(0);
        List<Song> songs = album2.getSongs();
        textView.setText(String.valueOf(songs.size()));

    }
    private void bindId() {
        textView=findViewById(R.id.text);
    }
}

注意,我们要获得一个album下的所有歌曲,要用如下代码:

 List<Album> albums = DataSupport.findAll(Album.class,true);
        Album album2 = albums.get(0);
        List<Song> songs = album2.getSongs();
        textView.setText(String.valueOf(songs.size()));

findAll后面的参数true不能丢,这是激进查询,它可以将关联表中的数据也查出来,如果没有了true,就无法查询到关联表中的数据。但这种方法的缺点是速度比较慢,而且无法迭代。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzl2040

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值