«

Android数据库框架:LitePal例子展示

时间:2024-3-2 18:30     作者:韩俊     分类: Android


Android数据库框架:LitePal例子展示

首先,想详细了解LitePal,请移步郭霖老师的专栏:Android数据库高手秘籍

本文,是我看完郭老师的博客,自己总结一遍,顺便写好代码,方便以后查看而已。

配置LitePal,请阅读Android数据库高手秘籍(二)——创建表和LitePal的基本用法

好了,直奔主题吧,直接看代码
工程目录如下:

litepal.xml文件

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="litepal" >
    </dbname>

    <version value="1" >
    </version>

    <list>
        <mapping class="com.example.litepal.model.News" >
        </mapping>

        <mapping class="com.example.litepal.model.Comment" >
        </mapping>

        <mapping class="com.example.litepal.model.Introduction" >
        </mapping>

        <mapping class="com.example.litepal.model.Category" >
        </mapping>
    </list>

</litepal>

AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.litepal"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:name="org.litepal.LitePalApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.litepal.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

News.java文件

/**
 * 新闻实体类(对数据的增删改查的操作都封装在DataSupport里,所以必须继承它)
 * @author yongan.lin
 */
public class News extends DataSupport {
    /** 新闻ID */
    private int id;
    /** 新闻的标题 */
    private String title;
    /** 新闻的内容 */
    private String content;
    /** 新闻的发布时间 */
    private Date publishDate;
    /** 新闻的评论数目 */
    private int commentCount;
    /** News和Introduction是一对一的关系 */
    private Introduction introduction;
    /** Comment和News是多对一的关系 */
    private List<Comment> commentList = new ArrayList<Comment>();
    /** Category和News是多对多的关系 */
    private List<Category> categoryList = new ArrayList<Category>();

    public News() {
        super();
    }

    public News(String title, String content, Date publishDate, int commentCount) {
        super();
        this.title = title;
        this.content = content;
        this.publishDate = publishDate;
        this.commentCount = commentCount;
    }
     此处省略get,set方法。。。

Introduction.java文件

/**
 * 新闻简介的实体类
 * @author yongan.lin
 */
public class Introduction extends DataSupport {
    /** 新闻简介的id */
    private int id;
    /** 新闻简介的导语 */
    private String guide;
    /** 新闻简介的摘要 */
    private String digest;

    public Introduction(String guide, String digest) {
        super();
        this.guide = guide;
        this.digest = digest;
    }
     此处省略get,set方法。。。
}

Comment.java文件

/**
 * 评论实体类
 * @author yongan.lin
 */
public class Comment extends DataSupport {
    /** 评论的ID */
    private int id;
    /** 评论的内容 */
    private String content;
    /** 评论的发表时间 */
    private Date publishDate;
    /** 一条Comment对应一条News */
    private News news;

    public Comment() {
        super();
    }

    public Comment(String content, Date publishDate) {
        super();
        this.content = content;
        this.publishDate = publishDate;
    }
     此处省略get,set方法。。。
}

Category.java文件

/**
 * 新闻类型的实体类
 * @author yongan.lin
 */
public class Category extends DataSupport{
    /** 新闻类型的id */
    private int id;
    /** 新闻类型的名字 */
    private String name;
    /** Category和News是多对多的关系 */
    private List<News> newsList = new ArrayList<News>();

    public Category(String name) {
        super();
        this.name = name;
    }
    此处省略get,set方法。。。
}

MainActivity.java文件(核心代码)

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    private void insert() {
        Comment comment1 = new Comment();
        comment1.setContent("好评!");
        comment1.setPublishDate(new Date());
        comment1.save();

        Comment comment2 = new Comment();
        comment2.setContent("赞一个");
        comment2.setPublishDate(new Date());
        comment2.save();

        News news = new News();
        news.getCommentList().add(comment1);
        news.getCommentList().add(comment2);
        news.setTitle("这是一条新闻标题");
        news.setContent("这是一条新闻内容");
        news.setPublishDate(new Date());
        news.setCommentCount(news.getCommentList().size());
        news.save();

        // //save()方法还是有返回值的,我们可以根据返回值来判断存储是否成功
        // if (news.save()) {
        // Toast.makeText(MainActivity.this, "存储成功", Toast.LENGTH_SHORT).show();
        // } else {
        // Toast.makeText(MainActivity.this, "存储失败", Toast.LENGTH_SHORT).show();
        // }

        // //使用saveThrows()方法来存储数据,一旦存储失败就会抛出一个DataSupportException异常
        // news.saveThrows();

        // LitePal提供了一个saveAll()方法
        List<News> newsList = new ArrayList<News>();
        // saveAll()方法接收一个Collection集合参数,只要把待存储的集合数据传入即可.
        DataSupport.saveAll(newsList);
    }

    private void delete() {
        //删除news表中id为2的记录
        DataSupport.delete(News.class, 2);  

        // 把news表中标题为“这是一条新闻标题”且评论数等于0的所有新闻都删除掉
        DataSupport.deleteAll(News.class, "title = ? and commentcount = ?",
                "这是一条新闻标题", "0");

        //把news表中所有的数据全部删除掉
        DataSupport.deleteAll(News.class);
        //注意:一个非持久化的对象如果调用了delete()方法则不会产生任何效果
    }

    private void update(){
        //把news表中id为2的记录的标题改成“这是二条新闻标题”
        News updateNews = new News();  
        updateNews.setTitle("这是二条新闻标题");  
        updateNews.update(2);  

        //把news表中标题为“这是一条新闻标题”且评论数量大于0的所有新闻的标题改成“这是二条新闻标题”
        News updateNews1 = new News();
        updateNews.setTitle("这是二条新闻标题");
        updateNews.updateAll("title = ? and commentcount > ?", "这是一条新闻标题", "0");

        //把news表中所有新闻的评论数清零
        News updateNews2 = new News();
        updateNews.setToDefault("commentCount");
        updateNews.updateAll();

        //还有一种比较笨的方法就是先找出某条新闻,修改赋值,然后save()。
    }

    private void find() {

        //查询news表中id为1的这条记录
        News oneNews = DataSupport.find(News.class, 1);

        // 查找出News表里的所有数据
        List<News> allNews = DataSupport.findAll(News.class);

        // 连缀查询,查询news表中所有评论数大于零的新闻
        List<News> newsList = DataSupport.where("commentcount > ?", "0").find(
                News.class);
        // 只要title和content这两列数据,将查询出的新闻按照发布的时间倒序排列,只查询出前10条数据
        List<News> newsList1 = DataSupport.select("title", "content")
                .where("commentcount > ?", "0").order("publishdate desc")
                .limit(10).find(News.class);
        // 只要第11到第20条新闻,offset()方法,用于指定查询结果的偏移量
        List<News> newsList2 = DataSupport.select("title", "content")
                .where("commentcount > ?", "0").order("publishdate desc")
                .limit(10).offset(10).find(News.class);

        // 激进查询,会把关联表中的数据一起查询出来
        List<News> news = DataSupport.findAll(News.class, true);
        List<Comment> commentList = news.get(0).getCommentList();

        // 原生查询
        Cursor cursor = DataSupport.findBySQL(
                "select * from news where commentcount>?", "0");
    }

    private void others() {
        // 统计news表中一共有多少行数据
        int result = DataSupport.count(News.class);
        // 统计一共有多少条新闻是零评论的
        int result1 = DataSupport.where("commentcount = ?", "0").count(
                News.class);

        // 要统计news表中评论的总数量(第二个参数是列名,表示我们希望对哪一个列中的数据进行求和,第三个参数用于指定结果的类型)
        int allCommentcounts = DataSupport.sum(News.class, "commentcount",
                int.class);

        // 统计news表中平均每条新闻有多少评
        double average = DataSupport.average(News.class, "commentcount");

        // 想要知道news表中所有新闻里面最高的评论数是多少
        int max = DataSupport.max(News.class, "commentcount", int.class);
        // 想要知道news表中所有新闻里面最少的评论数是多少
        int min = DataSupport.min(News.class, "commentcount", int.class);
    }
}

好了,最后附上源码的下载地址:http://download.csdn.net/detail/linyongan/8800811

标签: android

热门推荐