美文网首页
android-SQLite使用一

android-SQLite使用一

作者: Czppp | 来源:发表于2017-12-07 15:23 被阅读0次

在项目开发中多多少少会用到SQLite
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
primary key:主键
NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA :包含了 年份、月份、日期。
TIME: 包含了 小时、分钟、秒。

先创建一个类,写一下创建表的SQL语句

public class UserDao {

    public static final String TABLE_NAME = "user";//
    public static final String ID = "_id";//
    public static final String NAME = "name";//
    public static final String SEX = "sex";//
    public static final String AGE = "age";//
    public static final String HEGIHT = "height";//
    public static final String CREATE_TABLE = "create table if not exists " + TABLE_NAME
            + " ("
            + ID + " integer primary key autoincrement, " //主键 自增长
            + NAME + " text,"   //名字
            + AGE + " integer,"//年龄
            + SEX + " text,"    //性别
            + HEGIHT + " integer)";//
}

创建一个继承在SQLiteOpenHelper的类,并重写onCreate()和onUpgrade()方法。onCreat方法用于建表,onUpgrade方法用来更新表
比如 增加列名,删除列名等

public class DaoHelper extends SQLiteOpenHelper {

    /**
     * @param context
     */
    public DaoHelper(Context context) {
        super(context, "text.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(UserDao.CREATE_TABLE);
    }

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

建表类处理好,接下来就是对数据库的增删改查...创建数据库操作表
先实例化DaoHelper

  public Dao(Context context) {
        daoHelper = new DaoHelper(context);
    }

增加数据,使用insert方法为数据库插入一条数据,第一个参数是数据库表名,第二个一般为空,ContentValues 内部是用HashMap<key,values>实现的

insert(String table, String nullColumnHack, ContentValues values)
  public void insert(Uers user) {
        SQLiteDatabase db = daoHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(UserDao.NAME, user.name);
        values.put(UserDao.AGE, user.age);
        values.put(UserDao.SEX, user.sex);
        values.put(UserDao.HEGIHT, user.height);
        db.insert("user", null, values);
        db.close();
    }
replace(String table, String nullColumnHack, ContentValues initialValues)

这个方法要区分是insert还是update。如果要使用replace,一定要有主键。 写个栗子一下就明白了。。。
把原来的表删除,重新写过建表的SQL语句

public static final String CREATE_TABLE = "create table if not exists " + TABLE_NAME
            + " ("
            + NAME + " text primary key,"   //名字
            + AGE + " integer,"//年龄
            + SEX + " text,"
            + HEGIHT + " integer)";//

接下来使用这个方法了

 public void replace(Uers uers) {
        SQLiteDatabase db = daoHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(UserDao.NAME, uers.name);
        values.put(UserDao.AGE, uers.age);
        values.put(UserDao.SEX, uers.sex);
        values.put(UserDao.HEGIHT, uers.height);
        db.replace("user", null, values);
    }

测试数据

 Uers uers = new Uers();
        uers.name = "测试2";
        uers.age = 12;
        uers.sex = "女";
        uers.height = 2;
        dao.replace(uers);

        Uers uers1 = new Uers();
        uers1.name = "测试3";
        uers1.age = 12;
        uers1.sex = "女";
        uers1.height = 2;
        dao.replace(uers1);

        Uers uers2 = new Uers();
        uers2.name = "测试3";
        uers2.age = 12;
        uers2.sex = "男";
        uers2.height = 2;
        dao.replace(uers2);

打开数据库看看结果


image.png

通过栗子看出来,当插入的主键的值等于数据库已经存在的主键的值,那么就会替代原来那一列的数据--一般用过做数据缓存

下面使用sql语句添加数据,处理数据的操作一般当作事务(Transaction)处理:

   public void insert() {
        db = daoHelper.getWritableDatabase();
        db.beginTransaction();
        String sql = "insert into user(name,age,sex,height) values(?,?,?,?)";
        db.execSQL(sql, new String[]{"测试", "18", "女", "12"});
        db.setTransactionSuccessful();
        if (db != null && db.isOpen()) {
            db.close();
            db = null;
        }
    }

db.execSQL(String sql) ----SQL语句
execSQL(String sql, Object [] bindArgs)---第一个肯定是SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

删除数据的方法delete(String table, String whereClause, String[] whereArgs),参数一数据库表明,参数二 删除的条件,参数三 删除条件的值数组

  public voiddelete() {
        SQLiteDatabase db = daoHelper.getWritableDatabase();
        db.delete("user", UserDao.SEX + "=? " + " and " + UserDao.NAME + "=?", new String[]{"女","小张"});
        db.close();
    }

然后就写一条删除的sql语句

delete from tablename where name='namevalue' and sex='sexvalues'

修改数据 update(String table, ContentValues values, String whereClause, String[] whereArgs)

   public void updata() {
        SQLiteDatabase db = daoHelper.getWritableDatabase();
        db.beginTransaction();
        ContentValues values = new ContentValues();
        values.put(UserDao.NAME, "小6");
        values.put(UserDao.SEX, "男");
        values.put(UserDao.AGE, "20");
        values.put(UserDao.HEGIHT, 10);
        db.update("user", values, UserDao.NAME + "=?" + " and " + UserDao.SEX + "=?",
                new String[]{"测试1", "女"});
        db.setTransactionSuccessful();
    }

sql语句

update user set name=' ',sex=' ',age=20 where name=' ' and sex=' ' and age=18

查询数据

查找数据有两个方法

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
public Cursor rawQuery(String sql, String[] selectionArgs)。rawQuery的

table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

接下来写写两个方法栗子

  public void rawQuery() {
        SQLiteDatabase db = daoHelper.getWritableDatabase();
        String sql = "select * from " + UserDao.TABLE_NAME + " where " + UserDao.NAME + "=?";
        Cursor cursor = db.rawQuery(sql, new String[]{"测试2"});
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex(UserDao.NAME));
            Log.d(UserDao.NAME+" sss", name);
        }
    }
public void query() {
        SQLiteDatabase db = daoHelper.getWritableDatabase();
        Cursor cursor = db.query("user", null, null, null, null, null, null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex(UserDao.NAME));
            Log.d(UserDao.NAME, name);
        }
    }

在拼接SQL语句多留点心眼,太容易出错了,还有查询记得关游标和数据库,不然会内存泄漏

相关文章

网友评论

      本文标题:android-SQLite使用一

      本文链接:https://www.haomeiwen.com/subject/futdixtx.html