热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android数据存储之数据库(SQLite和litepal)

Android数据存储之数据库(SQlite和litepal)1、SQLite:Android提供了SQLiteOpenHelper来连接数据库,通过SQLiteDatabase来

Android数据存储之数据库(SQlite和litepal)

1、SQLite: Android提供了SQLiteOpenHelper来连接数据库,通过SQLiteDatabase来操作数据库,SQLiteDatabase类下由许多操作数据库的方法,最常见的有添加、删除和查询等操作。
SQLite提供了两种操作数据库的方法:
方法一:使用原生的数据库语句,关于数据库语句可以复习Java的SQLite相关语句操作
execSQL(String sql);
execSQL(String sql, Object[] bindArgs)
注:补充相关语句:
增——“insert into student(name,age) values(‘”+stu.getName()+”’”+”,”+stu.getAge()+”)”
删——“delete from student where studentid=?”,new String[]{id+”“}
改——“update student set name=?, age=? where studentid=?”,new String[] {stu.getName(),stu.getAge()+”“,stu.getStudentid()+”“}
查—— “select * from student where studentid=?”, new String[]{id+”“}
查询全部—-“select * from student “, null
方法二:
删:delete(String table, String whereClause, String[] whereArgs)
插入(增):insert(String table, String nullColumnHack, ContentValues values)
查询:query 、rawQuery
更新(改):update(String table, ContentValues values, String whereClause, String[] whereArgs)


下面封装了数据库的dao层和helper层,通过新建helper层新建了一个表格后,再通过dao层来操作数据表。
(1)helper层,新建类继承SQLiteOpenHelper,在构造方法中传入数据表名和上下文对象,重写onCreate执行数据库命令新建一个表格。

package com.example.wechatr.sqliteUtils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SqlDataBasehelper extends SQLiteOpenHelper {
public SqlDataBasehelper(Context context) {
super(context, "user.db", null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(userId integer primary key autoincrement,account" +
" varchar(20),password varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

(2)dao层,获取helper层的数据表对象,通过getReadableDatabase获取操作对象后进行数据操作。

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.wechatr.user_message;
import java.util.ArrayList;
import java.util.List;

public class UserDao {
private SQLiteDatabase db = null;
private SqlDataBasehelper sbh = null;
public UserDao(Context context)
{
sbh = new SqlDataBasehelper(context);
}

public boolean queryuser(String account,String code)
{
db = sbh.getReadableDatabase();
//查询语句
Cursor Query= db.query("User",null,null,null,null,null,null);
while (Query.moveToNext())
{
String Ac = Query.getString(Query.getColumnIndex("account"));
String Co = Query.getString(Query.getColumnIndex("password"));
if (account.equals(Ac)&&code.equals(Co))
{
db.close();
return true;
}
}
db.close();
return false;
}
public List queryuser()
{
List list = new ArrayList<>();
db = sbh.getReadableDatabase();
Cursor Query= db.query("User",null,null,null,null,null,null);
while (Query.moveToNext())
{
String Ac = Query.getString(Query.getColumnIndex("account"));
String Co = Query.getString(Query.getColumnIndex("password"));
user_message user = new user_message(Ac,Co);
list.add(user);
}
db.close();
return list;
}
public boolean adduser(String Ac,String Co)
{
db = sbh.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("account",Ac);
values.put("password",Co);
//插入语句
db.insert("user",null,values);
db.close();
return true;
}
public boolean deleteuser(String Ac)
{
db = sbh.getReadableDatabase();
//删除语句
db.delete("user","accOnut=?", new String[]{Ac});
db.close();
return true;
}
}

2、litepal litepal是开源的Android数据库框架,对平时用到的数据库功能进行封装,使得不用编写SQL语句就可以完成各种建立表格,增删改查等操作。
使用litepal之前需要对module进行配置:
(1)在配置文件.gradle中配置依赖:compile ‘org.litepal.android:core:1.4.1’
(2)配置litepal.xml:在assert文件夹下(若没有该文件夹,通过右击module目录–>New–>Directory创建)新建一个litepal.xml文件,编写如下内容:(具体意义看注释)


<litepal>

<dbname value="Bookbean" >dbname>

<version value="1" >version>
<list>
<mapping
class = "com.example.litepaltest.book">
mapping>
list>
litepal>

(3)修改AndroidManifest.xml文件:在该文件的


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.litepaltest">


<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

到此就已经配置好litepal环境,接下来使用litepal。
litepal使用LitePal.getDatabase()即可创建一个数据表,数据表名即是litepal.xml中的

package com.example.litepaltest;
import org.litepal.crud.DataSupport;
/**
* 让book bean 类继承DataSupport,以能够进行ARUD操作。
*/

public class book extends DataSupport{
private int id;
private String author;
private double price;
private int pages;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPages(int pages) {
this.pages = pages;
}
public void setPrice(double price) {
this.price = price;
}
public int getPages() {
return pages;
}
public String getAuthor() {
return author;
}
}

通过getDatabase建立表才能开始操作数据表。

LitePal.getDatabase();

(1)添加数据操作:定义一个addData方法,里面新建一个book对象,将各自的数据元set设置初始化,最后调用save提交,将数据写入数据库表中。

public void addData()
{
book bookbean = new book();
bookbean.setAuthor("vincent");
bookbean.setId(10);
bookbean.setName("litepal");
bookbean.setPages(450);
bookbean.setPrice(20);
bookbean.save();
}

(2)更改数据表中已存在的数据:
创建实例后,通过setPrice和setId方法来更新数据, 最后调用updateAll方法来执行更新操作。这里的updateAll指定了限制条件,和database中的where指定条件类似,不指定的时候表示更新所有的数据。但如果想将所有数据复位为默认值,需要调用setDefault来设置。如下。

   /*
* 注:这里要注意,创建实例后,说有数据库的数据成员都已经被
* 默认设置为默认值,比如id默认是0,name默认是null等,
* 如果想把某个字段设置为默认值,使用set方法不能起到作用,
* 因为本身默认字段就是想设置的值,可以通过调用
* book bookbean = new book();
* book.setDefault("id");
* book.updateAll();
* 这样所有书的id都被更新为0了,所有书是因为updateAll里面没有指定
* 约束的条目。
* */

public void updataData()
{
book bookbean = new book();
bookbean.setPrice(13.33);
bookbean.setId(1);
bookbean.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
}

(3)删除数据操作:使用deleteAll,指定数据表名和后面两个约束条件,如下,删除所有价格低于15元的数据。如果不指定则表示删除所有的数据。

    /*使用litepal删除数据
* */

public void deleteData()
{
//删除所有价格低于15的书
DataSupport.deleteAll(book.class,"price,"15");
}

(4)查询数据操作:

 /*使用litepal查询数据
* findAll查询所有
* findFirst查询第一条
* findLast查询最后一条
* select:指定查询那几列数据,例如下面例子指查询name和author两列数据
* List list = DataSupport.select("name","author").find(book.class);
* where方法:指定查询约束条件,例如查询页数大于400的书
* List list = DataSupport.where("page>?","400").find(book.class);
* order方法:指定结果的排序方式,例如将查询结果按照价格高到低排序
* List list = DataSupport.order("price desc").find(book.class);
* limit方法:指定查询结果数量,例如只查询表中的前三条数据
* List list = DataSupport.limit(3).find(book.class);
* offset方法:指定查询结果的偏移量,例如查询第234
* List list = DataSupport.limit(3).offset(1).find(book.class);
* 可以对着5个方法连缀使用:
* List list = DataSupport.select("name","author","pages")
* .where("pages>?","400")
* .order("price desc")
* .limit(10)
* .find(book.class);
* */
public void queryData()
{
List list = DataSupport.findAll(book.class);
for (book b:list)
{
Log.e("tag","b :"+b.toString());
}
}

同时,litepal还支持连缀使用:

 List books = DataSupport.select("name","author","pages")
.where("pages>?","100")
.limit(10)
.order("pages")
.find(book.class);

当然,党litepal提供的接口不能满足我们的需求是,也可以使用原生的SQL语句来操作:

Cursor cursor = DataSupport.findBySQL("select * from book where id >?and name = ?","2","harry");
...
...
...

关于数据库的操作使用就到此。
附:############本次deamon########


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
author-avatar
me
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有