android中的SQLite数据库小介

作为初学者来说数据库的操作还是挺不容易的,因为最近做了一个关于数据库的东西,想和大家分享一下自己对数据库理解,以及在写数据库的时候遇到的问题及其解决方法,在写android数据库的时候可以参照java的来写,语法雷同。

android中的数据库占用内存较小,使用方便,用途很广,所以熟悉android中的数据库对将来的开发很有帮助,由于我也是初次接触数据库,可能理解的不太透彻,还望大家取其精华去其糟粕。

首先,要明白一点,SQLite中的数据是以数据表的形式存储的,我先写了一个activity,重写SQLite数据库中的SQLiteOpenHelper类,代码如下。

package com.example.fingerprint;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;

public class data_ku extends SQLiteOpenHelper {//重写数据库帮助类
   // String name="20171101222 'caimingxiu' 'null'  '24'  '29' ";
    String  str_user="stu";
    String str="create table if not exists Stu (id integer primary key  autoincrement,name text ,finger text)";
    private SQLiteDatabase bd;
    private  static  final String data_name="dataku";
    //构造方法
    public data_ku(Context c)
    {
        //调用父类的构造方法,参数为(Context,数据库name,工厂(默认null),版本)
        super(c,data_name,null,3);
    }

    @Override
    //实现onCreate抽象方法,创建数据库
    public void onCreate(SQLiteDatabase db)
    {
        this.bd=db;
      //数据库对象执行SQL语句即可
        db.execSQL(str);
    }
public void insert(ContentValues contentValues)
{
    SQLiteDatabase db=getWritableDatabase();//得到database对象
    db.insert(str_user,null,contentValues);
    db.close();
}
    @Override
    //实现onUpgrade抽象方法,更新数据库(删掉原有的重新写)
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
       // db.execSQL(" ALTER TABLE Stu ADD phone VARCHAR(12)"); //往表中增加一列
    }
    //查询数据
    public Cursor query()
    {
        SQLiteDatabase bd=getWritableDatabase();
        Cursor c= bd.query(str_user,null,null,null,null,null,null);
      //全部查询
       return c;
    }


    //按学号删除数据
    public void del(int id)
    {
        if(bd==null)
            bd=getWritableDatabase();
        bd.delete(str_user,"id=?",new String[]{String.valueOf(id)});
    }

    public void replace(int id,String values)
    {
        bd=getWritableDatabase();
       // bd.execSQL("replace into stu VALUES(2,'caimingxiu','null','null','null') ");
        bd.execSQL("replace into stu VALUES "+ "(" + values +")" );
    }




    //添加列数
    public void addColumn(SQLiteDatabase db, String[] newColumnArr,
                           String oldTableName) {
        if (db == null || newColumnArr == null || newColumnArr.length < 1
                || TextUtils.isEmpty(oldTableName)) {
            // 数据库为空,新字段个数为0,添加字段后的字段数组个数为0,旧表名为空
            return;
        }
        // 拿到旧表中所有的数据
        Cursor cursor = db.rawQuery("select * from stu" , null);
        if (cursor == null) {
            // 如果游标为空,说明旧表中没有数据,如果是这种情况那就可以直接改表的字段,不需要转移数据了,代码后面也有,省略掉复制数据的操作就好
            return;
        }
        // 拿到原来的表中所有的字段名
        String[] oldColumnNames = cursor.getColumnNames();

        // 更改原表名为临时表
       // String tempTableName = "temp_stu" ;
        db.execSQL(
                "alter table stu"  + " rename to xxx" );
        // 创建新表
        if (oldColumnNames.length < 1) {
            // 如果原来的表中字段个数为0
            return;
        }
        // 创建一个线程安全的字符串缓冲对象,防止用conn多线程访问数据库时造成线程安全问题
        StringBuffer createNewTableStr = new StringBuffer();
        createNewTableStr
                .append("create table if not exists " + oldTableName + "(");
        for (int i = 0; i < oldColumnNames.length; i++) {
            if (i == 0) {
                createNewTableStr.append(oldColumnNames[i]
                        + " integer primary key autoincrement,");
            } else {
                createNewTableStr.append(oldColumnNames[i] + " text"+",");
            }
        }

        for (int i = 0; i < newColumnArr.length; i++) {
            if (i == newColumnArr.length - 1) {
                // 最后一个
                createNewTableStr.append(newColumnArr[i] + "text"+")");
            } else {
                // 不是最后一个
                createNewTableStr.append(newColumnArr[i] +"text"+ ",");
            }
        }

        db.execSQL(createNewTableStr.toString());

        // 复制旧表数据到新表
        StringBuffer copySQLStr = new StringBuffer();
        copySQLStr.append("insert into stu"  + " select *,");
        // 有多少个新的字段,就要预留多少个' '空值给新字段
        for (int i = 0; i < newColumnArr.length; i++) {
            if (i == newColumnArr.length - 1) {
                // 最后一个
               // copySQLStr.append("' ' from " + tempTableName);
                copySQLStr.append(" ' 'from xxx" );
            } else {
                // 不是最后一个
                copySQLStr.append("' ' text,");
            }
        }
        db.execSQL(copySQLStr.toString());
        // 删除旧表
        db.execSQL("drop table xxx");

        // 关闭游标
        cursor.close();
    }


    public  void close()
    {
        if(bd!=null)
            bd.close();
    }

}

在重写数据库帮助类的时候实现了数据库的增删改查的功能,也可以按照自己的需求来重写数据库,也可以不重写,直接用android自带的数据库帮助类也可以,重写数据库的好处是在应用的时候可以更加的方便 ,下面我来分快介绍一下我的代码。

 String str="create table if not exists Stu (id integer primary key  autoincrement,name text ,finger text)";

这是一个execSQL语句,用于创建一个数据库。

public void insert(ContentValues contentValues)
{
    SQLiteDatabase db=getWritableDatabase();//得到database对象
    db.insert(str_user,null,contentValues);
    db.close();
}

 每一个模块都要先打开数据库,SQLiteDatabase db=getWritableDatabase();这是以读写的形式打开数据库。这个insert实现了数据的添加,添加的数据为contentValues的对象携带的数据,将会在下一个activity中给出数据。

onUpdate方法为数据库更新的时候才会执行里面的语句。

    public Cursor query()
    {
        SQLiteDatabase bd=getWritableDatabase();
        Cursor c= bd.query(str_user,null,null,null,null,null,null);
      //全部查询
       return c;
    }

query模块为查找模块,返回值为游标(cursor)对象,可以通过游标对象来查找数据库中的数据。

public void del(int id)
    {
        if(bd==null)
            bd=getWritableDatabase();
        bd.delete(str_user,"id=?",new String[]{String.valueOf(id)});
    }

del为删除模块,通过id来删除相关数据。id=?

public void replace(int id,String values)
    {
        bd=getWritableDatabase();
       // bd.execSQL("replace into stu VALUES(2,'caimingxiu','null','null','null') ");
        bd.execSQL("replace into stu VALUES "+ "(" + values +")" );
    }

replace为更改数据表中的数据,括号中的参数即为要修改的数据。

由于本篇写的比较仓促,有很多待完善的地方,以后会继续改进,本篇内容较多,还会在下一篇中继续介绍SQLite数据库的使用,未完待续,欢迎转载

 

 

你可能感兴趣的:(android中的SQLite数据库小介)