支持数据类型:
- NULL,INTEGER,REAL,TEXT,BLOB
- 空值,整形值,浮点值,字符串,二进制对象。
动态数据类型(弱引用):
- 当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite会尝试将该值转化成该列的类型,如果不能转换,则该值将作为本身的类型。主键是integer时不能转。
sql语句:
- 查询语句: select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
- 如: select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 - 插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
- 更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
- 删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
占位?
sql中使用的单引号,如下:
db.execSQL("insert into person(name, age) values('林计钦', 24)");
为了解决转意的麻烦,推荐使用?占位
SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)如:
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"张三", 4});
execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
完整实例:
SQLiteDatabase db = ....;
db.beginTransaction();//开始事务
try {
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"李四", 20});
db.execSQL("update person set name=? where personid=?", new Object[]{"asd", 1});
db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,
如果不调用此方法会回滚事务
} finally {
db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
}
db.close();默认的一条sql语句就是一个事物,但是不如一次插入20条数据,用上面的这种方式就会提高性能。
GreenDao 升级
http://blog.csdn.net/growth58/article/details/50453038