在项目开发中多多少少会用到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语句多留点心眼,太容易出错了,还有查询记得关游标和数据库,不然会内存泄漏
网友评论