厦门网站建设首选厦门一联网络,马鞍山 做网站,自建的电子网站如何做推广,制作网页时一般把图像转化为哪几种格式?为什么?本文属于转载#xff0c;在此声明#xff0c;出处#xff1a;http://blog.csdn.net/guolin_blog/article/details/38556989 并且感谢guolin分享了这么精彩的博文。以下正文#xff1a; 经过前面几篇文章的学习#xff0c;我们已经把LitePal的表管理模块的功能都很好地掌握… 本文属于转载在此声明出处http://blog.csdn.net/guolin_blog/article/details/38556989 并且感谢guolin分享了这么精彩的博文。以下正文 经过前面几篇文章的学习我们已经把LitePal的表管理模块的功能都很好地掌握了相信大家都已经体会到了使用LitePal来创建表、升级表、以及建立表关联所带来的便利。那么从本篇文章开始我们将进入到一个新模块的学习旅程当中使用LitePal来进行表的CRUD操作。还没有看过前一篇文章的朋友建议先去参考 Android数据库高手秘籍(四)——使用LitePal建立表关联 。 LitePal提供的CRUD操作的API还是颇为丰富的一篇文章肯定是介绍不全的因此这里我们仍然是分几篇文章进行讲解本篇主要是介绍存储方面的API。 LitePal的项目地址是https://github.com/LitePalFramework/LitePal 传统的存储数据方式 其实最传统的存储数据方式肯定是通过SQL语句拼接字符串来进行存储的不过这种方式有点过于“传统”了今天我们在这里就不讨论这种情况。实际上Android专门提供了一种用于存储数据的简便方法使得我们不用编写SQL语句就可以执行存储操作。下面来看一下SQLiteDatabase中的insert()方法 [java] view plaincopy public long insert(String table, String nullColumnHack, ContentValues values) 可以看到insert方法接收三个参数第一个参数是表名第二个参数通常都用不到直接传null第三个参数则是一个封装了待存储数据的ContentValues对象。因此比如说我们想往news表中插入一条新闻就可以这样写 [java] view plaincopy SQLiteDatabase db dbHelper.getWritableDatabase(); ContentValues values new ContentValues(); values.put(title, 这是一条新闻标题); values.put(content, 这是一条新闻内容); values.put(publishdate, System.currentTimeMillis()); long id db.insert(news, null, values); 其中调用ContentValues的put()方法来添加待存储数据put()方法接收两个参数第一个参数是数据库表中对应的列名第二个参数就是要存储的值最后调用一下insert()方法这条新闻就会插入到news表当中了并且该数据行对应的id会作为返回值进行返回。 用法很简单是吗确实比起直接使用SQL语句SQLiteDatabase中提供的insert()方法的确简单了很多。但insert()方法也并非是那么的完美它还是有很多不方便的地方的比如说没有考虑表关联的情况我们需要手动对关联表的外键进行存储。再比如说没有提供批量存储的功能当我们有一个集合的数据需要存储时需要通过循环来遍历这个集合然后一次次地调用insert()方法来插入数据。 好了那么关于传统存储数据的用法就简单介绍到这里因为确实没什么的更多的用法了并且它也不是我们今天的主角。接下来就让我们看一看今天的惊喜学习如何使用LitePal来进行数据库存储的操作。 使用LitePal存储数据 LitePal中与存储相关的API其实并不多但用法还是颇为丰富的而且比起传统的insert()方法使用LitePal来存储数据可以简单到让你惊叹的地步那么今天我们就来完整地学习一下LitePal存储数据的所有用法。 在前面几篇文章当中我们在项目里已经建好了News、Comment、Introduction、Category这几个实体类通过这些实体类LitePal就可以把相应的表自动创建出来。现在来观察这几个实体类我们发现这几个类都是没有继承结构的。没错因为LitePal进行表管理操作时不需要这些实体类有任何的继承结构当时为了简单起见就没有写。但是进行CRUD操作时就不行了LitePal要求所有的实体类都要继承自DataSupport这个类因此这里我们就要把继承结构给加上才行。修改News类的代码如下所示 [java] view plaincopy public class News extends DataSupport{ ...... // 自动生成get、set方法 } 可以看到这里只是让News类继承自了DataSupport其它什么都没有改变。另外几个Comment、Introduction、Category类也使用同样的改法这里就不一一演示了。 继承了DataSupport类之后这些实体类就拥有了进行CRUD操作的能力那么比如想要存储一条数据到news表当中就可以这样写 [java] view plaincopy News news new News(); news.setTitle(这是一条新闻标题); news.setContent(这是一条新闻内容); news.setPublishDate(new Date()); news.save(); 怎么样是不是非常简单不需要SQLiteDatabase不需要ContentValues不需要通过列名组装数据甚至不需要指定表名只需要new出一个News对象然后把要存储的数据通过setter方法传入最后调用一下save()方法就好了而这个save()方法自然就是从DataSupport类中继承而来的了。 除此之外save()方法还是有返回值的我们可以根据返回值来判断存储是否成功比如说这样写 [java] view plaincopy if (news.save()) { Toast.makeText(context, 存储成功, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, 存储失败, Toast.LENGTH_SHORT).show(); } 可以看出save()方法返回的是一个布尔值用于表示存储成功还是失败但同时也说明这个方法是不会抛出异常的。有些朋友希望如果存储失败的话就抛出异常而不是返回一个false那就可以使用saveThrows()方法来代替如下所示 [java] view plaincopy News news new News(); news.setTitle(这是一条新闻标题); news.setContent(这是一条新闻内容); news.setPublishDate(new Date()); news.saveThrows(); 使用saveThrows()方法来存储数据一旦存储失败就会抛出一个DataSupportException异常我们可以通过对这个异常进行捕获来处理存储失败的情况。 那有些细心的朋友可能已经注意到使用的insert()方法来存储数据时是有返回值的返回的是插入行对应的id。但LitePal中的save()方法返回的是布尔值那么我们怎样才能拿到存储成功之后这条数据对应的id呢对此LitePal使用了一种非常巧妙的做法还记得我们在每个实体类中都定义了一个id字段吗当调用save()方法或saveThrows()方法存储成功之后LitePal会自动将该条数据对应的id赋值到实体类的id字段上。让我们来做个试验吧代码如下所示 [java] view plaincopy News news new News(); news.setTitle(这是一条新闻标题); news.setContent(这是一条新闻内容); news.setPublishDate(new Date()); Log.d(TAG, news id is news.getId()); news.save(); Log.d(TAG, news id is news.getId()); 在save之前打印一下news的id在save之后再打印一次现在运行一下打印结果如下所示 OK在save之前打印的id是0说明此时id这个字段还没有被赋值在save之后打印的id是1说明此时id已经被赋值了。那么我们再到数据库表中再查看一下这条记录到底有没有存储成功吧如下图所示 可以看到这条新闻确实已经存储成功了并且对应的id正是1和我们前面打印的结果是一致的。 不过LitePal的存储功能显示不仅仅只有这些用法事实上LitePal在存储数据的时候默默帮我们做了很多的事情比如多个实体类之间有关联关系的话我们不需要考虑在存储数据的时候怎么去建立数据与数据之间的关联因为LitePal一切都帮我们做好了。 还是通过一个例子来看一下吧Comment和News之间是多对一的关系一条News中是可以包含多条评论的因此我们就可以这样写 [java] view plaincopy 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(); 可以看到这里先是存储了一条comment1数据然后存储一条comment2数据接着在存储News之前先把刚才的两个Comment对象添加到了News的commentList列表当中这样就表示这两条Comment是属于这个News对象的最后再把News存储到数据库中这样它们之间的关联关系就会自动建立了。让我们查看数据库表检查一下吧首先看一下news表如下所示 OK第二条新闻已经成功存储到news表中了这条新闻的id是2。那么从哪里可以看出来关联关系呢我们在上一篇文章中学过多对一关联的时候外键是存放在多方的因此关联关系我们要到comment表中去查看如下所示 可以看到两条评论都已经成功存储到comment表中了并且这两条评论的news_id都是2说明它们是属于第二条新闻的。怎么样仅仅是在存储数据之前建立好实体类之间的关系再调用一下save()方法那么数据之间的关联关系就会自动建立了是不是非常简单上面的代码只是多对一情况的一种用法还有一对一和多对多的情况其实用法都是差不多的相信你已经能举一反三了。 另外LitePal对集合数据的存储还专门提供了一个方法比如说我们有一个News集合那么应该怎样去存储这个集合中的每条News呢传统情况下可以这样写 [java] view plaincopy ListNews newsList; ... for (News news : newsList) { news.save(); } 通过一个循环来遍历出这个集合中的每一个News对象然后逐个调用save()方法。这样的写法当然是可以的但是效率会比较低因为调用save()方法的时候除了会执行存储操作之外还会去分析News类的关联关系那么每次循环都去重新分析一遍关联关系显然是比较耗时的。因此LitePal提供了一个saveAll()方法专门用于存储集合数据的用法如下所示 [java] view plaincopy ListNews newsList; ... DataSupport.saveAll(newsList); saveAll()方法接收一个Collection集合参数只要把待存储的集合数据传入即可。这个方法可以完成和上面一段代码完全一样的功能但效率却会高得多而且写法也更加简单。 好了这样我们就把LitePal中提供的存储操作的用法全部都学完了那么今天的文章就到这里下一篇文章当中会开始讲解更新和删除操作的用法。感兴趣的朋友请继续阅读 Android数据库高手秘籍(六)——LitePal的修改和删除操作 。 LitePal开源项目地址 https://github.com/LitePalFramework/LitePal 转载于:https://www.cnblogs.com/fengju/p/6336128.html