• android开发之路09(浅谈SQLite数据库01)


    1.SQLite数据库:

    SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使

     

    用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 只要确保

     

    SQLite的二进制文件存在即可开始创建、连接和使用数据库。

    对于SDK来讲,已经内置了SQLite的程序,因此我们不需要在SQLite官网上下载。一般数据库采用的都是静态的数据类

     

    型,而我们的SQLite数据库采用的是动态数据库,会根据存入值自动判断。SQLite 数据库相对于其他数据库最大的特点是我们

     

    可以把各种类型的数据保存到任何字段中,而不用关心字段声明的类型是什么。有一种特殊的情况是,定义为INTEGER PRIMARY 

     

    KEY 的字段只能存储64位整数。SQLite具有以下五种类型:

    1.NULL:空值;

    2.INTEGER:带符号的整形,具体取决于存入数字的范围大小;

    3.REAL:浮点数字;

    4.TEXT:字符串文本;

    5.BLOB:二进制对象;

    2.相关操作

    ①创建数据库:sqlite3 test.db

    ②创建表:create table userInfouserId integer primary key autoincrement,name varchar(20));

    SQLite数据库可以解析大部分标准SQL语句:

    ①查询语句:select * from 表名 where 条件子句 group by 分组子句 having...order by 排序子句

    例如:select * from userInfo order by id desc

          select * from userInfo group by name having count*>1

    ②插入语句:insert into 表名(字段列表) values(值列表)

    例如:insert into userInfonameage) values'张三'20

    ③更新语句:update 表名 set 字段名=值 where 条件子句

    例如:update person set name = '张三' where id = 10

    ④删除语句:delete from 表名 where 条件子句

    例如:delete from userInfo where id = 10

     

    实例代码:

    1.创建一个JavaBean

    public class Student {

    private int sid;

    private String name;

    private short age;

     

    public Student() {

    super();

    }

    public Student(int sid, String name, short age) {

    super();

    this.sid = sid;

    this.name = name;

    this.age = age;

    }

     

    public int getSid() {

    return sid;

    }

    public void setSid(int sid) {

    this.sid = sid;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public short getAge() {

    return age;

    }

     

    public void setAge(short age) {

    this.age = age;

    }

    @Override

    public String toString() {

    return "Student [sid=" + sid + ", name=" + name + ", age=" + age + "]";

    }

     

     

     

    }

     

    2.创建一个用于创建SQLite数据库的类DBOpenHelper .java

     

    public class DBOpenHelper extends SQLiteOpenHelper{

     

    private static final String DBNAME="data.db";

    private static CursorFactory factory=null;

    private static final int VERSION=1;

    public DBOpenHelper(Context context) {

    super(context, DBNAME, factory, VERSION);

    }

     

    //当数据库第一次被创建的时候,执行该方法

    @Override

    public void onCreate(SQLiteDatabase db) {

    //sql语句中的字段名与Student.java的成员变量对应

    String sql="create table t_student (sid integer primary key,"

    + "name varchar(20),age integer)";

    db.execSQL(sql);

    }

    @Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

     

    }

     

    }

     

    3.创建一个操作数据库的类StudentDAO .java

     

    public class StudentDAO {

    private DBOpenHelper helper;

    private SQLiteDatabase db;

     

    public StudentDAO(Context context) {

    // 创建DBOpenHelper的实例

    helper = new DBOpenHelper(context);

    }

     

    public void add(Student student) {

    /**

     * Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。

     * (getReadableDatabase()方法中会调用getWritableDatabase()方法)

     * 1.getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写.

     * 2.getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打

     * 开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。

     */

    db = helper.getWritableDatabase();

    String sql = "insert into t_student (sid,name,age) values (?,?,?)";

    db.execSQL(sql, new Object[] { student.getSid(), student.getName(),

    student.getAge() });

    }

     

    public void update(Student student) {

    db = helper.getWritableDatabase();

    String sql = "update t_student set name = ?,age = ? where sid = ?";

    db.execSQL(sql, new Object[] { student.getName(), student.getAge(),

    student.getSid() });

     

    }

     

    public Student query(int sid) {

    db = helper.getWritableDatabase();

    String sql = "select sid,name,age from t_student where sid=?";

    // Cursor实际上就是一种存储数据的集合

    Cursor cursor = db.rawQuery(sql, new String[] { String.valueOf(sid) });

    // 在cursor查找到的结果集合中将光标移动到到下一行,也就是将光标指向查找到的下一个结果

    if (cursor.moveToNext()) {

    // 通过getColumnIndex()方法可以得到指定列的名称,如果不存在返回-1

    return new Student(cursor.getInt(cursor.getColumnIndex("sid")),

    cursor.getString(cursor.getColumnIndex("name")),

    cursor.getShort(cursor.getColumnIndex("age")));

    }

    return null;

    }

     

    // 这里使用可变参数,来满足参数个数不固定的情况

    public void delete(Integer... sids) {

    if (sids.length > 0) {

    // StringBuffer线程安全的,多用于多线程中,用来对字符串进行复杂的操作

    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < sids.length; i++) {

    sb.append('?').append(',');

    }

    sb.deleteCharAt(sb.length() - 1);

    SQLiteDatabase database = helper.getWritableDatabase();

    String sql = "delete from t_student where sid in (" + sb + ")";

    database.execSQL(sql, (Object[]) sids);

    }

    }

     

    public List<Student> getScrollData(int start, int count) {

    List<Student> students = new ArrayList<Student>();

    db = helper.getWritableDatabase();

    String sql = "select * from t_student limit ?,?";

    Cursor cursor = db.rawQuery(sql, new String[] { String.valueOf(start),

    String.valueOf(count) });

    while (cursor.moveToNext()) {

    students.add(new Student(

    cursor.getInt(cursor.getColumnIndex("sid")),

    cursor.getString(cursor.getColumnIndex("name")),

    cursor.getShort(cursor.getColumnIndex("age"))));

    }

    return students;

     

    }

     

    public long getCount(){

    db=helper.getWritableDatabase();

    String sql="select count(sid) from t_student";

    Cursor cursor=db.rawQuery(sql,null);

    if(cursor.moveToNext()){

    return cursor.getLong(0);

    }

    return 0;

    }

     

    }

     

     

  • 相关阅读:
    free命令中buffers和caches的区别
    ubuntu14.0安装ITK的步骤
    Ubuntu服务器上相关软件或应用时常打不开的问题
    机器学习之训练集_验证集_测试集
    VS C++ 并发编程
    Matlab保存uint16格式文件的相关注意事项
    OpenCV中的SVM参数优化
    caffe之solver.prototxt文件参数设置
    FY21 Microsoft Inspire Online Sessions Journey Guidance
    Azure Function Runtime版本和IP输出格式问题
  • 原文地址:https://www.cnblogs.com/smallkure/p/5289999.html
Copyright © 2020-2023  润新知