Android学习笔记(43):Java开发SQLite程序

正如前面一文说的,SQLite多用于嵌入式开发中,但有时为了更方便的编辑数据库文件,我们也常常需要开发在电脑上运行的SQLite程序。这种情况是经常发生的,比如在我们需要把一大批的txt文件中的数据插入到一个数据库中的时候。

 

还好这是很简单的,所以本文我们来学习如何用Java开发SQLite程序。

 

1)准备工作

下载sqlite-jdbc-版本号.jar文件,放到jre\lib\ext文件夹。如我的路径是C:\Program Files\Java\jre1.8.0_77\lib\ext

 

2)一个测试代码,可以先运行感受下,具体内容下面再详细讲。

 

import   java.sql.*;   
    
public   class   SQLiteTest   {   
 public static void main(String[] args)
    {
        try
        {
         //连接SQLite的JDBC
         Class.forName("org.sqlite.JDBC");
         
         //建立一个数据库名test.db的连接,如果不存在就在当前目录下创建之
         Connection mConnection = DriverManager.getConnection("jdbc:sqlite:test.db3");
         
         Statement state = mConnection.createStatement();
         
         //创建表
         state.executeUpdate( "create table tb1(name varchar(20), grade int);" );
 
         //插入数据
         state.executeUpdate( "insert into tb1 values('名字1',90);" );
         state.executeUpdate( "insert into tb1 values('名字2',58);" );
         state.executeUpdate( "insert into tb1 values('名字3',69);" );
         state.executeUpdate( "insert into tb1 values('名字4',85);" );
 
         //查询数据
         ResultSet result = state.executeQuery("select * from tb1;");
 
         //打印查询结果
         while (result.next()) {
             System.out.print(result.getString("name") + " ");
             System.out.println(result.getString("grade"));
         }
         result.close();
         mConnection.close(); //结束数据库的连接
 
        }
        catch( Exception e )
        {
         e.printStackTrace ( );
        }
    }
}
 

输出结果:

名字1 90

名字2 58

名字3 69

名字4 85

 

3)连接数据库

我们需要连接到可用的JDBC驱动程序。之后我们需要建立到某个数据库的连接,如果这个数据库不存在,就会在指定位置创建数据库文件。并通过连接创建一个Statement实例。

//连接SQLite的JDBC

         Class.forName("org.sqlite.JDBC");

//建立一个数据库名test.db的连接,如果不存在就在当前目录下创建之

         Connection mConnection = DriverManager.getConnection("jdbc:sqlite:test.db3");

Statement state = mConnection.createStatement();

 

4)数据库的操作:

对于不需要取得返回数据的SQL语句,我们都调用StatementexecuteUpdate(str)方法执行对应SQL语句。包括建表、插入、删除等等。对于需要得到返回数据的SQL查询语句,我们需要调用executeQuery(str)方法,返回结果为一个ResultSet 对象,就像它的名字一样,这是一个查询结果的集合,我们可以用它的next()方法等来操控集合的行指针,用getXxx(“列名”)方法获取某一行的某一列的值。

 

需要注意每个SQLite语句要以“;”结尾。

 

一种较特殊的情况就是插入语句中需要以传入参数的形式来写,这样会省下拼接字符串的诸多麻烦。这时候我们需要用到PreparedStatement类,使用的步骤如下所示:

<1> 定义插入数据的规范:

PreparedStatement prs = mConnection.prepareStatement("insert into tb1 values (?,?);");

<2>传入参数:

第一个参数为列数,第二个参数为该列的值。

prs.setString(1,"名字5");

prs.setString(2,"83");

<3>执行语句:

调用下面的方法真正执行插入语句。

prs.addBatch();

mConnection.setAutoCommit(false);

prs.executeBatch();

mConnection.setAutoCommit(true);

 

我们修改上面的测试文件用传参的形式插入数据:

 

import   java.sql.*;   
    
public   class   SQLiteTest   {   
 public static void main(String[] args)
    {
        try
        {
         //连接SQLite的JDBC
         Class.forName("org.sqlite.JDBC");
         
         //建立一个数据库名test.db的连接,如果不存在就在当前目录下创建之
         Connection mConnection = DriverManager.getConnection("jdbc:sqlite:test.db3");
         
         Statement state = mConnection.createStatement();
         
         //创建表
         state.executeUpdate( "create table tb1(name varchar(20), grade int);" );
         
         //插入数据
         state.executeUpdate( "insert into tb1 values('名字1',90);" );
         state.executeUpdate( "insert into tb1 values('名字2',58);" );
         state.executeUpdate( "insert into tb1 values('名字3',69);" );
         state.executeUpdate( "insert into tb1 values('名字4',85);" );
 
         //以传参的形式插入数据
         PreparedStatement prs = mConnection.prepareStatement("insert into tb1 values (?,?);");
         prs.setString(1,"名字5");
         prs.setString(2,"83");
         prs.addBatch();
         mConnection.setAutoCommit(false);
         prs.executeBatch();
         mConnection.setAutoCommit(true);
         
         //查询数据
         ResultSet result = state.executeQuery("select * from tb1;");
 
         //打印查询结果
         while (result.next()) {
             System.out.print(result.getString("name") + " ");
             System.out.println(result.getString("grade"));
         }
         result.close();
         mConnection.close(); //结束数据库的连接
 
        }
        catch( Exception e )
        {
         e.printStackTrace ( );
        }
    }
  }   

 

(5)关闭结果集、断开与数据库的连接

result.close();

mConnection.close();

大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己的DBHelper: /** * * @author Kee.Li * * 1. 继承了SmartDBHelper,不需要重写SQLiteOpenHelper的那两个方法 * 2. 父类构造方法参数modelClasses是实体类的数组,也就是需要生产表的类的Class数组 * */ public class DBHelper extends SmartDBHelper { //数据库名称 private final static String DATABASE_NAME = "books.db"; //数据库版本 private final static int DATABASE_VERSION = 2; //需要生成数据库表的类的数组 private final static Class<?>[] modelClasses = {Book.class,User.class}; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION,modelClasses); } } 2.创建app需要的实体,也就是对应的数据库表(这里的实体添加到DBHelper的modelClasses数组中) /** * 数据库的实体 * @author Kee.Li * 关于注解: * Table: 此类对应的数据库表名 * Id:标识此属性为数据库自增长的id,应为int型 * Column:标识此属性对应的数据库字段名 */ @Table(name="t_books") public class Book{ @Id @Column(name="book_id") private int bookId; @Column(name="book_name") private String bookName; @Column(name="book_author") private String bookAuthor; //set get 方法省略.... } 3. 实现DAO,也就是对实体的CRUD类 /** * @author Kee.Li * * 此类只需要继承TemplateDAO,在构造方法里面给父类的属性dbHelper赋值,即可实现CRUD操作 * 若有复杂的操作,可以自定义方法 */ public class BookDAO extends TemplateDAO { /** * 创建DAO时初始化连接数据库对象helper * @param context */ public BookDAO(Context context) { super(new DBHelper(context)); } } 4. activity的调用 bookDAO = new BookDAO(this); List books = bookDAO.find(); 好了,到此结束,如果有什么好的建议或者意见,希望可以共同学习!谢谢大家!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这波lucio来全学了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值